目录
一、问题描述
二、解题思路
三、代码
四、复杂度分析
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交:
让两个指针分别遍历两个链表,当指针走到链表末尾时,跳到另一个链表的开头。
这样两人走的总路程是一样的(a + c + b + c)
如果有相交节点,最终会在相交处相遇;
如果没有相交节点,最终两个指针都走到 null。
假设:
A 长度为:a + c
B 长度为:b + c
相交部分长度为:c
让两个指针分别从 A 和 B 开始走:
第一个指针走路径:a → c → b
第二个指针走路径:b → c → a
当他们第二次相遇的时候,就是相交节点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 定义两个指针 pA 和 pB,分别指向两个链表的头
ListNode* pA = headA;
ListNode* pB = headB;
// 遍历两个链表
while (pA != pB) {
// 如果走到末尾了,就从另一个链表的头开始走
pA = (pA == nullptr) ? headB : pA->next;
pB = (pB == nullptr) ? headA : pB->next;
}
// 相遇时返回相交节点,或都为 nullptr(说明无交点)
return pA;
}
};
时间复杂度:O(m + n)
每个指针最多遍历两个链表长度
空间复杂度:O(1)
没有使用额外空间