劍指Offer_#52_兩個連結串列的第一個公共節點
阿新 • • 發佈:2020-07-19
劍指Offer_#52_兩個連結串列的第一個公共節點
劍指offerContents
題目
輸入兩個連結串列,找出它們的第一個公共節點。
如下面的兩個連結串列:
在節點 c1 開始相交。
注意:
- 如果兩個連結串列沒有交點,返回 null.
- 在返回結果後,兩個連結串列仍須保持原有的結構。
- 可假定整個連結串列結構中沒有迴圈。
- 程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。
思路分析
這題的難點在於,相交的節點之前的節點數量不同,所以如果兩個指標同時遍歷,不會相遇,也就無從判斷是否是相交節點。
一個很巧妙的方法是:
兩個指標同時遍歷兩個連結串列,如果遍歷結束,這個指標就去遍歷另一個連結串列。這樣一來,相當於兩個指標在相交節點之前走過的路程是一樣的,正好可以在相交節點相遇。
解答
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode h1 = headA;
ListNode h2 = headB;
//如果沒有交集,h1,h2最後同時指向null,跳出迴圈,返回null
while(h1 != h2){
if(h1 == null) h1 = headB;
else h1 = h1.next;
if (h2 == null) h2 = headA;
else h2 = h2.next;
}
return h1;
}
}
複雜度分析
時間複雜度O(n)
空間複雜度O(1)