如何判斷鍊錶有環以及求入環節點

2021-09-23 23:45:58 字數 831 閱讀 3973

如何判斷單鏈表有環,並找出環的入口? 

時間o(n),空間o(1)。 

這個面試題還是蠻有趣的,當時只想出了第一問,第二問實在巧妙。 

如圖這個單鏈表,藍色的部分是環。 

對於如何判斷鍊錶有環,可以從起點發出兩個指標,乙個一次一步,另乙個一次兩步,如果兩個指標相遇,那麼這個單鏈表就有環。 

設綠色的地方是指標相遇點。 

對於第二問求環的入口,從第一問的相遇點和起點各發出乙個速度為一步的指標,兩個指標相遇的地方就是環的入口。 

這個是別人給我的答案,我簡單推了一下公式好像是對的,但是實踐了後又發現好像有點細節問題,這裡留下我的答案: 

第一問得出相遇點後,再發出乙個指標,統計這個指標再次回到這個點的距離,也就是環的距離。 

然後從起點再發出兩個指標,乙個指標在另乙個前面,兩個指標的距離就是環的距離,當兩個指標再次相遇的時候就是環的入口。

下面補充一下計算入環節點的過程:

1)首先判斷是否有環,有環時,返回相遇的節點,無環,返回null

* 2)有環的情況下, 求鍊錶的入環節點

*   fast再次從頭出發,每次走一步,

*   slow從相遇點出發,每次走一步,

*   再次相遇即為環入口點。

判斷鍊錶是否有環,找到入環節點 python實現

用快慢指標的方法。時間複雜度o n 空間複雜度o 1 設定p1為慢指標,p2為快指標,兩者初始時都指向鍊錶的頭結點 慢指標p1每次前進1步,快指標p2每次前進2步。如果鍊錶存在環,則快指標p2肯定先進入環,慢指標p1後進入環,兩個指標必定會相遇。如果不存在環,則快指標會先行到達鍊錶的尾部變為none...

鍊錶判斷是否有環,如有,找入環節點

一條鍊錶如何判斷是否有環?若是有環那怎麼找到鍊錶環的入口?思路 用快慢兩個指標分別從煉表頭開始,慢指標一次走乙個節點,快指標一次走兩個節點next next,這樣如果有環那快指標務必會跑到慢指標後面,隨即兩者之間的距離一次會縮小一步,最終相遇。若是未相遇且快指標的 next 為 null,則說明鍊錶...

鍊錶 怎麼判斷鍊錶有環,怎麼找環節點

定義快慢指標fast和slow,fast每次前進兩步,slow每次前進一步 當fast和slow在到達鏈尾之前相遇的話,就證明有環 類似於在操場上跑步跑的慢的被快的套圈但總會遇到 fast和slow相遇之後,fast不動,slow回到最初的起點,然後一步一步的等在再次相遇,這時候相遇地點就是環結點 ...