leetcode 142:判斷鍊錶是否存在環,若存在環則返回鍊錶開始入環的第乙個節點,否則返回null。
採用快慢雙指標,慢指標每次移動乙個結點,快指標每次移動兩個結點。
如圖所示,假設頭節點到入環結點的長度為n,環的長度為k,慢指標移動的步數為x,快指標移動的步數為2x。
第一階段:快慢指標在環中相遇(若有環它們必定相遇)
此時有 (x - n) % k == ( 2x - n ) % k
第二階段:我們從頭節點和快慢指標相遇的結點,都使用慢指標進行一步一步的移動,指標相遇的結點就是入環結點。
首先,這兩個慢指標都會走n步,因為從頭節點出發的慢指標到達環的步長為n。
那我們來思考為什麼從第一階段相遇的結點出發,走n步就能到達入環的結點。
接著上面的數學式子,兩邊同時加上n,(x - n + n) % k == (2x - n + n) % k
即 x % k == 2x % k,此時x應當是k的倍數,即 x % k == 2x % k == 0.
也就是說,繼續走完n步之後,正好能繞環整數次。
Floyd判圈演算法
參考 判斷鍊錶中是否有環 大概就是說兩個指標首先都指向鍊錶的首部,然後乙個每次走一步,乙個每次走兩步,如果有環,那麼慢的肯定能夠追上快的,否則快的就會先到達終點。求環的長度 兩個指標重合時,快的停止,慢的每次走一步,計算圈的長度。求環的起點 if head null slowptr slowptr ...
floyd判圈演算法
floyd判圈演算法又稱龜兔賽跑演算法 兩個指標 p1,p2 p1 每次向後跳一次 p2 每次向後跳兩次 顯然,如果 p1,p2 相遇才有環 現在我們想求環長和環的起點.設起點到環的距離為 len 環的起點離相遇點距離 rem 設兩個指標分別走了 p,q 步 那麼,p len rem a l,q l...
Floyd判圈演算法
自 問題 如何檢測乙個鍊錶是否有環,如果有,那麼如何確定環的起點.龜兔解法的基本思想可以用我們跑步的例子來解釋,如果兩個人同時出發,如果賽道有環,那麼快的一方總能追上慢的一方。進一步想,追上時快的一方肯定比慢的一方多跑了幾圈,即多跑的路的長度是圈的長度的倍數。基於上面的想法,floyd用兩個指標,乙...