面試題52. 兩個鏈表的第一個公共節點


題目:

 

 

 

 

解答:

方法一:雙指針法

(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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM