Leetcode 160. 相交链表(双指针)
题目描述:
题解:
解法1:仿照双指针求解环形链表的问题,将链表A或者链表B构造成一个环,然后求环形链表的入口。
解法2:
- 创建两个指针 pApA 和 pBpB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
- 当 pApA 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pBpB 到达链表的尾部时,将它重定位到链表 A 的头结点。
- 若在某一时刻 pApA 和 pBpB 相遇,则 pApA/pBpB 为相交结点。
- 想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4,9,11},相交于结点 9。 由于 B.length (=4) < A.length (=6),pBpB 比 pApA 少经过 22 个结点,会先到达尾部。将 pBpB 重定向到 A 的头结点,pApA 重定向到 B 的头结点后,pBpB 要比 pApA 多走 2 个结点。因此,它们会同时到达交点。
- 如果两个链表存在相交,它们末尾的结点必然相同。因此当 pApA/pBpB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。
AC代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* pA = headA; ListNode* pB = headB; if(headA == NULL || headB == NULL) return NULL; int flag = 0; while(1) { if(pA == pB) return pA; pA = pA->next; pB = pB->next; if(pA == NULL) { flag ++; pA = headB; } if(pB == NULL) { flag ++; pB = headA; } if(flag >=3) break; } return NULL; } };