給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
首先建立兩個指標slow和fast都指向頭指標,指標slow步長為1,fast步長為2。如果slow和fast在非空結點相遇,那麼鍊錶一定有環。
記len為環的長度,假設fast比slow提前x步進入環,y步之後兩指標相遇
相遇前,fast走了2x+2y距離,slow走了y距離。相遇問題轉化為求解這個同餘方程。又因為slow步長為1,因此此方程必有解。所以用這種快慢指標的方式是可以檢測是否存在環的。
此外,n必然是環長度len的整數倍。
記x1為環入口前的長度,x2和x3分別是slow和fast進入環之後走過的距離
在環中相遇,表示在環中位置相同,仍根據同餘方程可得nmo
dlen
=0n\quad mod\quad len = 0
nmodle
n=0在判斷存在環之後,尋找環的入口,我們考慮如下過程。
從fast的位置向前走,那麼一定會有乙個岔路,這個岔路就是環的入口。根據環迴圈的特點,我們將這一過程中的移動方向倒轉,分別從頭節點和fast沿next移動,那麼相遇的位置就是環的入口了
完整**如下:
/*
public class listnode }*/
public
class
solution
if(fast==null || fast.next==null)
return null;
listnode e = fast;
listnode iriguti = phead;
while
(e!=iriguti)
return e;
}}
鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。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,此...