题目:
解答:
方法一:双指针法
(1)创建两个指针 pA 和 pB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
(2)当 pA到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pB 到达链表的尾部时,将它重定位到链表 A 的头结点。
(3)若在某一时刻 pA 和 pB相遇,则pApB 为相交结点。
(4)想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4,9,11},相交于结点 9。 由于 B.length (=4) < A.length (=6),pB 比 pA 少经过 22 个结点,会先到达尾部。将 pB重定向到 A 的头结点,pA重定向到 B 的头结点后,pB要比 pA多走 2 个结点。因此,它们会同时到达交点。
如果两个链表存在相交,它们末尾的结点必然相同。因此当 pApA/pBpB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。
复杂度分析
时间复杂度 : O(m+n)O(m+n)。
空间复杂度 : O(1)O(1)。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 12 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 13 { 14 if (NULL == headA || NULL == headB) 15 { 16 return NULL; 17 } 18 19 ListNode *pA = headA; 20 ListNode *pB = headB; 21 22 while (pA != pB) 23 { 24 pA = (pA == NULL ? headB : pA->next); 25 pB = (pB == NULL ? headA : pB->next); 26 } 27 28 return pA; 29 } 30 };