leetcode題解之相交鍊錶

2021-10-01 15:00:16 字數 3338 閱讀 9273

'''

編寫乙個程式,找到兩個單鏈表相交的起始節點。

注意:如果兩個鍊錶沒有交點,返回 null.

在返回結果後,兩個鍊錶仍須保持原有的結構。

可假定整個鍊錶結構中沒有迴圈。

程式盡量滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。

'''雙指標法演算法說明:兩個鍊錶長度不一定相等,但是拼接在一起以後一定等長。pa和pb開始分別指向ha和hb,然後分別遍歷兩個鍊錶。

假設鍊錶ha比hb長,則當pb指向none時,pa仍指向鍊錶ha的某個結點。接下來pa繼續後移一位,pb指向ha。

二者繼續後移,則當pa指向none時,pb仍指向鍊錶ha的某個結點。接下來pb繼續後移一位,pa指向hb,此時pa和pb對齊了。

之後二者繼續後移,當pa==pb時,說明二者指向了同一結點(也可能同時指向了none),迴圈結束。

'''演算法1:暴力列舉

執行用時: 超出時間限制

記憶體消耗: 17.0 mb, 在所有 python3 提交中擊敗了23.80%的使用者

'''def getintersectionnode(self, heada: listnode, headb: listnode) -> listnode:

pa = heada

while pa:

pb = headb

while pb:

if pa == pb:

return pa

else:

pb = pb.next

pa = pa.next

else:

return none

'''演算法2:雜湊查詢

執行用時: 168 ms,  在所有 python3 提交中擊敗了79.35%的使用者

記憶體消耗: 28.3 mb, 在所有 python3 提交中擊敗了90.80%的使用者

'''def getintersectionnode2(self, heada: listnode, headb: listnode) -> listnode:

lib = set()

pa = heada

while pa:

lib.add(pa)

pa = pa.next

pb = headb

while pb:

if pb in lib:

return pb

else:

pb = pb.next

else:

return none

'''演算法3:雙指標法

執行用時: 156 ms,  在所有 python3 提交中擊敗了95.62%的使用者

記憶體消耗: 27.9 mb, 在所有 python3 提交中擊敗了99.80%的使用者

'''def getintersectionnode3(self, heada: listnode, headb: listnode) -> listnode:

pa, pb = heada, headb

while pa != pb:

pa = pa.next if pa else headb

pb = pb.next if pb else heada

return pa

'''演算法4:雙指標法

執行用時: 160 ms,  在所有 python3 提交中擊敗了91.69%的使用者

記憶體消耗: 28 mb, 在所有 python3 提交中擊敗了99.80%的使用者

'''def getintersectionnode4(self, heada: listnode, headb: listnode) -> listnode:

if heada is none or headb is none:

return none

pa, pb = heada, headb

for i in range(2):#pa和pb各指向none一次,然後二者剛好對齊

while pa and pb:

pa, pb = pa.next, pb.next

if pa is none:

pa = headb

else:

pb = heada

while pa != pb: #遍歷可能存在共同結點的區域

pa, pb = pa.next, pb.next

return pa

a = 99

b = 8 if a == 9 else 80

print(b)

a = [2, 4, 3, 5, 8]

b = [5, 6, 4]

c = [1,2,3,4]

p = ha = listnode(0)

for x in a:

p.next = listnode(x)

p = p.next

p = hb = listnode(0)

for x in b:

p.next = listnode(x)

p = p.next

p = hc = listnode(0)

for x in c:

p.next = listnode(x)

p = p.next

p = ha

while p.next is not none:

p = p.next

p.next = hc.next

p = hb

while p.next is not none:

p = p.next

p.next = hc.next

p = ha.next

while p is not none:

print(p.val, end=' ')

p = p.next

print()

p = hb.next

while p is not none:

print(p.val, end=' ')

p = p.next

print()

x = solution()

p = x.getintersectionnode4(ha.next, hb.next)

while p:

print(p.val, end=' ')

p = p.next

print()

LeetCode 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3在節點 c1 開始相交。注意 思路1 先使兩個鍊錶等長,然後一起遍歷兩個鍊錶 第乙個相等的即為所求的起始結點。definition for singly linked list.s...

Leetcode 相交鍊錶

leetcode 輸入 intersectval 2,lista 0,9,1,2,4 listb 3,2,4 skipa 3,skipb 1 輸出 reference of the node with value 2 輸入解釋 相交節點的值為 2 注意,如果兩個列表相交則不能為 0 從各自的表頭開始...

Leetcode相交鍊錶

public class listnode listnodes new hashset while heada null while headb null return null 寫點 哈哈,拿到題我想到用啥結構做呢?然後想著最近一直在用雜湊解決問題,這題用雜湊呢?可以,搞它!先把鍊錶a放到表裡,然...