# 判斷兩個鍊錶是否相交
# 方法一,首尾相接法。先首尾相連,再判斷是否有環。有環則說明相交
# 首尾相連
defcreate_annulation
(phead1, phead2):if
not phead1 or
not phead2 or
not phead1.
next
ornot phead2.
next
:return
none
last = phead1.
next
# 指向phead1最後乙個節點
while last.
next
: last = last.
next
# p1最後節點的next指向p2頭節點
last.
next
= phead2
return phead1
# 判斷是否有環
defexist_loop
(phead):if
not phead or
not phead.
next
:return
none
slow = phead
fast = phead
while slow.
next
and fast.
next
.next
: slow = slow.
next
fast = fast.
next
.next
if slow == fast:
return
true
return
false
# 方法二,hashset法。遍歷鍊錶1,將所有next域的節點儲存在hashset中,遍歷鍊錶2,與當前hashset中的值去比較,如果有相同的,則說明相交了。
defjudge_x
(phead1, phead2):if
not phead1 or
not phead2 or
not phead1.
next
ornot phead2.
next
:return
none
hashset =
set(
) p = phead1 # 用來遍歷鍊錶
hashset.add(p)
while p.
next
: p = p.
next
hashset.add(p)
# 這裡注意要你把所有的節點都儲存到hashset中
p = phead2
while p:
if p.
next
in hashset:
return
true
p = p.
next
return
false
if __name__ ==
"__main__"
:# 先構造出兩個相交的鍊錶
phead1 = lnode(0)
p1 = lnode(1)
p2 = lnode(2)
p3 = lnode(3)
p4 = lnode(4)
phead1.
next
= p1
p1.next
= p2
p2.next
= p3
p3.next
= p4
phead2 = lnode(10)
pa = lnode(11)
phead2.
next
= pa
pa.next
= p2
p2.next
= p3
p3.next
= p4
# newphead1 = create_annulation(phead1, phead2)
# print (exit_loop(newphead1))
print
(judge_x(phead1, phead2)
)
判斷兩個鍊錶是否相交
思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...
判斷兩個鍊錶是否相交
參考 判斷兩個鍊錶是否相交 假設兩個鍊錶都沒有環 有以下三種方法 1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 2 把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交 3 先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相...
判斷兩個鍊錶是否相交
判斷兩個鍊錶是否相交,程式設計之美 給出了以下方法 1.判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為 o length h1 length h2 這種方法很耗時間 2.利用計數的方法 乙個簡單的做法是對第乙個鍊錶的結點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每...