'''
編寫乙個程式,找到兩個單鏈表相交的起始節點。
注意:如果兩個鍊錶沒有交點,返回 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放到表裡,然...