两条链表有相交与不相交两种情况,分析如下:
- 当两条链表相交时,我们设A链表头到交点的长度为
a
,B链表头到交点的长度为b
,交点到链表尾的长度为c
,当遍历完链表A时将指针移动到链表B的表头,相应地,遍历完链表B时将指针移动到链表A的表头。这样,a + c + b
等于b + c + a
,最后两个指针相遇于交点,此时退出循环,返回该交点;- 当两条链表不相交时,按照上述方法遍历两条链表,当
abc
都遍历了一遍时,两个指针都刚好指向null
,此时退出循环,返回null
。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (headA == nullptr || headB == nullptr) return nullptr; //空链表没有交点
ListNode *pA = headA, *pB = headB;
while (pA != pB)
{
if (pA) pA = pA->next;
else pA = headB; //遍历完A链表再从B链表头开始
if (pB) pB = pB->next;
else pB = headA; //遍历完B链表再从A链表头开始
}
return pA;
}
};