題目描述
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出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,此...