編寫乙個程式,找到兩個單鏈表相交的起始節點。
如下面的兩個鍊錶:
輸入:intersectval = 8, lista = [4,1,8,4,5], listb = [5,0,1,8,4,5], skipa = 2, skipb = 3
輸出:reference of the node with value = 8
輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [4,1,8,4,5],鍊錶 b 為 [5,0,1,8,4,5]。在 a 中,相交節點前有 2 個節點;在 b 中,相交節點前有 3 個節點。
注意:方法一:暴力法
對於a中每個節點都遍歷一次b中的節點
complexity analysis
方法二:雜湊表
將a中的節點放入雜湊表中,然後檢查b中的每個節點,如果出現在雜湊表中,則那個節點時相交節點
complexity analysis
class solution
while(headb)
}return null;}};
方法三:雙指標法
維護兩個指標pa和分別在a和b頭部初始化的pb。然後讓它們都遍歷列表,每次乙個節點。
當pa到達列表的末尾時,把它重定向到b的開頭;類似地,當pb到達列表末尾時,將其重定向到a的頭部。
如果在任意點papa遇到pbpb,則pa/pb為交點節點。
要了解為什麼上面的技巧會奏效,請考慮以下兩個列表:a =和b =,它們在節點'9'處相交。因為b。長度(=4)< a長度(=6),pb將首先到達合併列表的末尾,因為pb比pa只遍歷2個節點。通過將pb重定向到head a,和pa重定向到head b,我們現在要求pbpb比papa恰好多移動2個節點。所以在第二次迭代中,保證它們同時到達交點。
如果兩個列表有交集,那麼它們的最後乙個節點必須是相同的。所以當pa/pb到達列表末尾時,分別記錄a /b的最後乙個元素。如果最後兩個元素不相同,那麼這兩個列表就沒有交集。
class solution
return pb;}};
自己寫的**通不過。。。但是上面這段**沒有判斷最後乙個元素是否相同,所以遇到不相交的列表,不應該變成無限迴圈嗎? LeetCode160 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅用 o 1 記憶體。解題思路 1.找到兩個鍊錶長度差n後...
Leetcode160 相交鍊錶
解法一 用乙個集合去判斷 class solution sets listnode tmp1 heada listnode tmp2 headb while tmp1 while tmp2 tmp2 tmp2 next return nullptr 解法二 先遍歷一遍兩個鍊錶得到的長度差n,然後讓長...
LeetCode 160 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅...