LeetCode 判斷單鏈列表是否存在環

2021-06-28 06:29:13 字數 1296 閱讀 5893

判斷單鏈列表是否存在環,即某個節點的next指向鍊錶中在它前面的節點,這樣在鍊錶尾部形成一環。

1.判斷是否存在環

用乙個fast指標,乙個slow指標,slow每次移動1,fast每次移動2.

若鍊錶存在環,移動快的fast指標一定在環內追趕上移動慢的slow指標,則相遇

2.找到環的入口

當兩指標第一次相遇後,證明存在環。現在將fast指標重新設為head,slow指標不變。

接下來fast和slow都每次移動1。兩指標在此相遇的位置即為環的入口。

證明:設初次相遇時迴圈執行n次。設初次相遇為m點,head到環入口距離為a,環入口到m點距離為b。環路周長為l。第一次相遇時fast已經走了k圈(不能保證相遇時fast只多走1圈)。

slow走的距離為d1 = a + b = n

fast走的距離為d2 = a + b+ k*l = 2n

d2 - d1 = n = k*l,可只長度n恰好為環周長的整數倍。

此時slow從相遇點m再走n步,可以回到相遇點m。

此時fast從head出發走n步,也可到達m。

實際上兩者在走完a步後就相遇了,此處即為環的入口。

# python**:

slow = fast = head

while true:

if not fast.next or not fast.next.next:

# no loop

return none

else:

slow = slow.next

fast = fast.next.next

if slow == fast:

break

# encountered for 1st time. now set out again

while fast != slow:

fast = fast.next

slow = slow.next

# now both fast and slow point to the loop entrance

return fast

應用:

可以用來解決兩個單鏈表是否存在交點的問題,如下

a:          a1 → a2

↘c1 → c2 → c3

↗           

b:     b1 → b2 → b3

可以先遍歷a找到尾節點taila,設定taila.next = headb。若a與b有交點,則從heada再出發可以找到乙個環,環路入口即為鍊錶交點。

單鏈表 判斷單鏈表L是否是遞增的(雙指標法)

單鏈表的儲存結構 typedef struct linklist 分析 定義乙個指標p夠不夠用?你要判斷是否遞增,說明要比較前後兩節點的資料域。如果前者一直大於後者,那麼可判斷該單鏈表遞增。所以這裡要定義兩個指標,pre p.思路 1.定義兩個前後指標pre p,並pre開始指向頭結點 2.通過wh...

leetcode 392 判斷s是否是t的子串行

class solution def issubsequence self,s str,t str bool s is much smaller than t i,j 0,0 while i len s 1 and j len t 1 if s i t j i 1 j 1 else j 1 if i...

如何判斷乙個單鏈表是迴圈鍊錶

1.迴圈鍊錶的特點是收尾相接,沒有頭指標,也沒有尾指標。如果去遍歷迴圈鍊錶,則是死迴圈。2.這裡判斷迴圈鍊錶的方法是 用兩個指標,乙個指標是塊指標 跳乙個節點遍歷 遍歷快 p p netxt next 乙個指標逐步遍歷,慢指標。如果在遍歷當中,如果發現這兩個指標有可能是出現null指標的話,那邊它是...