劍指offer鍊錶中環的入口節點

2021-10-16 01:24:20 字數 882 閱讀 3175

s## 題目描述

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

建兩個指標,快指標,慢指標,快指標一次走兩步,慢指標一次走一步。

如果沒環,那快指標肯定會先走到尾節點。

如果有環,那麼快慢指標一定會在某一時刻在環中相遇(類似龜兔賽跑扣圈,快指標先入環,因為快指標時慢指標速度的兩倍,所以慢指標第一次入環就會被快指標追上)。設無環部分的鍊錶有a個節點,有環部分的鍊錶有b個節點。快指標的路程為f,慢指標的路程為s,快指標繞環跑了n圈,快慢指標相遇時,到入口的距離為x。那麼有 f = 2s,f=s+nb+x,s= a+x。可得s = nb。正常來說,所有走到鍊錶入口節點的指標,所走路程都為a+mb(m為繞環形部分的圈數,具體是多少我們並不關心,為整數)。所以,對於慢指標來說,還需要走a步才能到環的入口位置。而a正是頭節點到入口節點的長度大小,所以只需要讓快指標重新指向頭節點,每次走一步,快慢指標再次相遇的位置,即是環的入口位置。

public

class

solution

listnode fast = phead;

listnode slow = phead;

while

(true

) fast = fast.next.next;

slow = slow.next;

//這裡的判斷條件不寫在while中是因為它倆的初始值相等

if(fast == slow)

break;}

//fast重新指向頭節點,製造第二次相遇

fast = phead;

while

(fast != slow)

return fast;

}}

以上。

劍指offer 鍊錶中環的入口

問題描述 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。假設x為環前面的路程 紅色路程 a為環入口到相遇點的路程 綠色路程,假設順時針走 c為環的長度 藍色路程 設定快慢指標fast和slow,快指標的速度是慢指標的兩倍 當快慢指標相遇的時候 此時慢指標走的路程為sslo...

劍指Offer 鍊錶中環的入口節點

1.如果鍊錶中有環,可以通過快慢指標,最後快慢指標肯定會相會於環中的某個節點 2.從這個相會的節點開始,當再次遇到該節點,即可統計環中有節點數 n 3.設定兩個指標p,p1,p從頭先走 n 步,p1在頭部,然後兩個指標同時 走,當兩指標相遇時,相遇的節點即是環的入口。c struct listnod...

劍指Offer 鍊錶中環的入口結點

第一步 先找到環中的乙個點 第二步 確定環中有幾個元素,比如n個 第三步 讓第乙個指標先走n步,第二個指標再從頭走,兩指標相遇即為入口結點 class solution def entrynodeofloop self,phead write code here meetingnode self.m...