乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。
***牛客網
方法一:
假設x為環前面的路程(黑色路程),a為環入口到相遇點的路程(藍色路程,假設順時針走), c為環的長度(藍色+橙色路程)
當快慢指標相遇的時候:
此時慢指標走的路程為sslow = x + m * c + a
快指標走的路程為sfast = x + n * c + a
2 sslow = sfast
2 * ( x + m*c + a ) = (x + n *c + a)
從而可以推導出:
x = (n - 2 * m )*c - a
= (n - 2 *m -1 )*c + c - a
即環前面的路程 = 數個環的長度(為可能為0) + c - a
什麼是c - a?這是相遇點後,環後面部分的路程。(橙色路程)
所以,我們可以讓乙個指標從起點a開始走,讓乙個指標從相遇點b開始繼續往後走,
2個指標速度一樣,那麼,當從原點的指標走到環入口點的時候(此時剛好走了x)
從相遇點開始走的那個指標也一定剛好到達環入口點。
所以2者會相遇,且恰好相遇在環的入口點。
最後,判斷是否有環,且找環的演算法複雜度為:
時間複雜度:o(n)
空間複雜度:o(1)
**:
listnode* entrynodeofloop(listnode*phead)方法二:斷鏈法遍歷一遍並將鏈的next置空,這樣鏈中就不存在環了。else
return
null;
}//相遇點
tmp1 =phead;
while(tmp1 !=tmp2)
return
tmp1;
}
直到遍歷到最後的節點就是環的入口節點。
由於要判斷next節點,所以需要兩個節點,其中乙個節點記錄上一節點。
**:
publiclistnode entrynodeofloop(listnode phead)returnslow;
}
鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。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,此...