題目:
解答:
方法一:雙指針法
(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 };