1. 程式人生 > 實用技巧 >劍指Offer_#52_兩個連結串列的第一個公共節點

劍指Offer_#52_兩個連結串列的第一個公共節點

劍指Offer_#52_兩個連結串列的第一個公共節點

劍指offer

Contents

題目

輸入兩個連結串列,找出它們的第一個公共節點。
如下面的兩個連結串列:

在節點 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)