36. 兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。
兩個指標同時遍歷兩個鍊錶,每個指標遍歷完當前鍊錶繼續遍歷另一鍊錶,當兩個指標相等或者某個指標為空時退出迴圈
定義兩個指標, 第一輪讓兩個到達末尾的節點指向另乙個鍊錶的頭部, 最後如果相遇則為交點
假定 p1 指向表 a , p2 指向表 b, 兩個鍊錶公共結點之後的長度肯定相等,因為是同一段鍊錶。所以長度不等只能來自公共結點之前的部分。
兩個鍊錶的第乙個公共結點之前的長度要麼相等,要麼不相等,如果相等,那麼兩個指標 p1 , p2 同時後移,肯定能同時找到公共結點;如果兩個鍊錶的長度不一樣,那麼比如 a 鍊錶比 b 鍊錶長 k 個結點,那麼當 p2 到達 b 鍊錶的表尾的時候,p1 肯定距離到達 a 煉表表尾還差 k 個結點,隨後 p2 開始從 a 鍊錶的表頭開始遍歷。當 p1 鍊錶到達表尾時後,p1 從 b 鍊錶的表頭開始遍歷, 此時 p2 已經在 a 鍊錶上走了 k 個結點,而 p1 在 b 鍊錶上 才剛起步,走了 0 個結點,而恰好 a 就比 b 長 k 個結點,所以 p1 和 p2 會同時到達 公共結點。
鍊錶1 在公共結點之前的結點個數 為 a1, 公共結點之後的結點個數為 a2, 同理,鍊錶2 在公共結點之前的結點個數為 b1, 公共結點之後的結點個數為 b2, 因為公共結點的之後的部分是同一條鍊錶,所以a2 == b2, 所以上面的思路就是 a1 + b1 == b1 + a1
1public
class
solution
6 listnode p1 =phead1;
7 listnode p2 =phead2;
8while(p1 != p2 && (p1 != null && p2 != null))17}
18return
p1;19
}20 }
你變成我,走過我走過的路。
我變成你,走過你走過的路。
然後我們便相遇了..
1public
class
solution
10return
p1;11
}12 }
leetcode執行時間為1ms, 空間為41.4mb
時間複雜度:最多把兩個鍊錶合起來遍歷一遍,所以時間複雜度為o(m+n)
空間複雜度:o(1)
1public
class
solution
12 cur1 =cur1.next;13}
14return
cur1;15}
16 }
把 其中乙個鍊錶存入hashset中,遍歷第二個鍊錶,判斷該結點是否存在於hashset中,如果存在的話直接返回該結點
劍指offer 36 兩個鍊錶的第乙個公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 實現 public class listnode public class solution return nhead1 分析 最直接的思路是遍歷一條鍊錶,並將每...
劍指offer36 兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。方法一 用兩個指標同時從兩個鍊錶的表頭開始走,當走到自己的鍊錶結尾的時候開始從另乙個鍊錶的表頭開始向後走。終止條件就是兩個指標第一次相遇。此時指標位置即為所求。兩個鍊錶的節點和是一定的,所以兩個指標一定可以同時遍歷完兩條鍊錶,即在最後時刻兩個指標一定是重合的 ...
劍指offer36 兩個鍊錶的第乙個公共子節點
輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 因為公共節點之後的資料都是一樣的,所以如果兩個鍊錶不一樣長,如果存在公共尾,那麼長的鍊錶前一段一定是不匹配的 struct listnode class solution ...