鍊錶中環的入口結點

2021-09-24 15:48:08 字數 1487 閱讀 8180

題目描述

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

思路描述

鍊錶中容易出現的題目就是這種的習題,鍊錶帶環的相關習題。

首先我們需要尋找環的相遇點。

這裡我們採用的是快慢指標的做法,快指標fast每次走兩步,慢指標slow每次走一步,這樣他們都從鍊錶的頭結點出發,當慢指標slow走了s步時,快指標fast走了2s步。當他們都走到環中去,最後會相遇,當fast等於slow時,fast已經在環中轉了n圈。(假設環的周長為r) 2s=

s+nr

=>s=

nr2s = s +nr => s = nr

2s=s+n

r=>s=

nr根據相遇點求環的入口點。

假設鍊錶的長度為l,煉表頭到環入口點的距離為x,入口點到相遇點的距離為a,則剩下的半個環的距離為l-a-x。 x+a

=nr=

>x+

a=n(

r−1)

+(l−

x)=>x=

n(r−

1)+(

l−a−

x)x+a=nr =>x+a = n(r-1)+(l-x) =>x=n(r-1)+(l-a-x)

x+a=nr

=>x+

a=n(

r−1)

+(l−

x)=>x=

n(r−

1)+(

l−a−

x)由上面的分析可以知道,當乙個指標p1從煉表頭開始出發,另乙個指標p2從相遇點出發,每次走一步,當p2指標走了n-1圈後,再走l-a-x步,會在環的入口點和p1指標相遇。此時p1剛從鍊錶入口點走到環的入口點。

// 慢指標每次走一步,快指標每次走兩步,直到相遇

while

(fast != null && fast != slow)

slow = slow.next;

}// 相遇後兩個點即為相遇點

listnode miss = fast;

// 乙個指標從相遇點出發,乙個指標從鍊錶入口點出發,二者會在環的入口點相遇

fast = phead;

slow = miss;

while

(fast != slow)

return fast;

}}

鍊錶中環的入口結點

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

鍊錶中環的入口結點

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

鍊錶中環的入口結點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路1 設環中結點數是n,環的入口位置是x 距離起點走多少步 用快慢指標p,q,q移動的速度是p的2倍,當兩個指標相遇時p走的步數是y,q走的步數是2y,q比p多走k個環的距離,即 2y y kn,則y kn。p距離環的入口點的距離為y x,此...