23 鍊錶中環的入口結點

2021-10-08 06:57:44 字數 895 閱讀 6833

nowcoder

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。要求不能使用額外的空間。

使用雙指標,乙個快指標 fast 每次移動兩個節點,乙個慢指標 slow 每次移動乙個節點。因為存在環,所以兩個指標必定相遇在環中的某個節點上。

假設環入口節點為 y1,相遇所在節點為 z1。

假設快指標 fast 在圈內繞了 n 圈,則總路徑長度為 x+ny+(n-1)z。z 為 (n-1) 倍是因為快慢指標最後已經在 z1 節點相遇了,後面就不需要再走了。

而慢指標 slow 總路徑長度為 x+y。

因為快指標是慢指標的兩倍,因此 x+ny+(n-1)z = 2(x+y)。

我們要找的是環入口節點 y1,也可以看成尋找長度 x 的值,因此我們先將上面的等值分解為和 x 有關:x=(n-2)y+(n-1)z。

上面的等值沒有很強的規律,但是我們可以發現 y+z 就是圓環的總長度,因此我們將上面的等式再分解:x=(n-2)(y+z)+z。這個等式左邊是從起點x1 到環入口節點 y1 的長度,而右邊是在圓環中走過 (n-2) 圈,再從相遇點 z1 再走過長度為 z 的長度。此時我們可以發現如果讓兩個指標同時從起點 x1 和相遇點 z1 開始,每次只走過乙個距離,那麼最後他們會在環入口節點相遇。

23 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。題解 首先是確定鍊錶中有環,第二步是找到鍊錶的入口。在確定是否有環的過程中,設定乙個快指標,乙個慢指標,快指標一次走兩步,慢指標一次走一步,如果兩個指標可以相遇,證明存在環。在找鍊錶入口結點的過程中,定義兩個指標p1 p2指向...

23 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。思路 1.判斷鍊錶中有環 2.得到環中節點的數目 3.找到環中的入口節點 public class solution if flag else l f phead for int i 0 i n i while l f ret...

鍊錶中環的入口結點

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