鍊錶中環的入口結點

2021-10-23 07:20:49 字數 1364 閱讀 9490

題目描述

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

思路:

設定快慢指標,都從煉表頭出發,快指標每次走兩步,慢指標一次走一步,假如有環,一定相遇於環中某點(結論1)。接著讓兩個指標分別從相遇點和煉表頭出發,兩者都改為每次走一步,最終相遇於環入口(結論2)。以下是兩個結論證明:

兩個結論:

1、設定快慢指標,假如有環,他們最後一定相遇。

2、兩個指標分別從煉表頭和相遇點繼續出發,每次走一步,最後一定相遇與環入口。

證明結論1:設定快慢指標fast和low,fast每次走兩步,low每次走一步。假如有環,兩者一定會相遇(因為low一旦進環,可看作fast在後面追趕low的過程,每次兩者都接近一步,最後一定能追上)。

證明結論2:

設:煉表頭到環入口長度為–a

環入口到相遇點長度為–b

相遇點到環入口長度為–c

則:相遇時

快指標路程=a+(b+c)k+b ,k>=1 其中b+c為環的長度,k為繞環的圈數(k>=1,即最少一圈,不能是0圈,不然和慢指標走的一樣長,矛盾)。

慢指標路程=a+b

快指標走的路程是慢指標的兩倍,所以:

(a+b)*2=a+(b+c)k+b

化簡可得:

a=(k-1)(b+c)+c 這個式子的意思是: 煉表頭到環入口的距離=相遇點到環入口的距離+(k-1)圈環長度。其中k>=1,所以k-1>=0圈。所以兩個指標分別從煉表頭和相遇點出發,最後一定相遇於環入口。

/*

public class listnode }*/

public

class

solution

if(fast==null||fast.next==null)

return null;

slow=phead;

while

(slow!=fast)

return fast;

}}

一開始疑惑:慢指標可能不止一圈,應該是n圈(0<=n從slow走了一步,fast走了兩步開始的寫法:

/*

public class listnode }*/

public

class

solution

slow=phead;

while

(slow!=fast)

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,此...