鍊錶 鍊錶中環的入口結點

2021-09-13 17:50:52 字數 1263 閱讀 7318

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

知識點回顧:

快慢指標:

思路:使用快慢指標

假設有p,q兩指標,p每步跨乙個結點,q每步跨兩個結點。那麼經過k步之後q比p多走過的結點數為k。如果鍊錶中沒有環,那麼q永遠在p的前面,兩指標不會相遇。如果鍊錶有環,且環中結點個數為r,那麼q會進入環內繞圈。如果兩指標會在相遇,一定是在環內,並且q比p多繞n圈;也就是說一定存在k,只要滿足k=n * r,就能使兩指標相遇。

如下圖所示,假設鍊錶起點為a,入口結點為b,相遇點為c,ab段長度為m,bc段長度為n,環長度為r。經過上面的證明,我們知道c點一定存在,並且根據兩指標走過的路程,存在等式2(m+n+h*r)= m+n+g * r ,這樣我們得到m=(g-2h) * r-n,也就是說ac段長度是環長度的整數倍。如果p指標重新從煉表頭出發,q指標從相遇點c出發,步伐一致,那麼當p走到b點,q也正好走到b。

python實現:

// an highlighted block

class

solution

: def entrynodeofloop

(self, phead)

: # write code here

if not phead or not phead.next or not phead.next.next:

return none

slow = phead.next

fast = slow.next

# 找到相遇點

while fast != slow and fast.next:

slow = slow.next

fast = fast.next.next

if slow == fast:

# 慢指標回到表頭,快指標留在相遇點,二者同步往前直到相遇在入口結點

slow = phead

while slow != fast:

fast = fast.next

slow = slow.next

return slow

return none

----

----

----

----

----

- 原文:https:

80931915

鍊錶 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null 鍊錶中某些結點構成了乙個環,找打環的入口結點 head a1 a2 a3.使用雙層迴圈,例如對於結點a1,遍歷整個鍊錶判斷是否有a1 head next head head next a2,a3,an 依次 測試報錯,沒通過 ...

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...