leetcode142 環形鍊錶2

2021-10-06 01:18:02 字數 1634 閱讀 3662

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

說明:不允許修改給定的鍊錶。

輸入:head =[3

,2,0

,-4]

, pos =

1輸出:tail connects to node index 1

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

設定快慢指標,快指標一次走兩步,慢指標一次走一步。如果快指標走到空了,則表示沒有環。如果快指標和滿指標相遇了,表明有環,且相遇位置在環內(因為一旦進了環,兩個指標就不可能出來了,只能在裡面繞圈)。

當兩個指標相遇後,將其中乙個指標重新指回頭結點,然後兩個指標每次同時走一步,相遇位置就是環的入口節點位置。

證明

(1)快慢指標第一次相遇時,慢指標在環內不會走完一圈:假設你在操場跑步,a的速度是你的2倍。你從當前位置出發,a從任意位置出發。當你跑完一圈後,a跑了兩圈,在這個過程中,a肯定會遇見一次你,因此在你沒跑完一圈過程中就會碰到a。極限情況是你們倆從同一地點出發,當你跑完一圈後,你們倆在原來的位置相遇。

上圖是乙個環形鍊錶,假設快慢指標在*處相遇,環中逆時針旋轉。相遇點距離環入口的距離分別是bc。假設在相遇時,快指標已經在環中轉過了m圈且m至少等於1,因此快指標所有的路程是h+m(b+c)+c。慢指標所走的路徑是h+c。由於快指標的速度是慢指標的2倍,因此可以得到如下關係:

h+m(b+c)+c = 2h + 2c --> (m-1)(b+c) + b = h.

當相遇後,快指標回頭部,慢指標從相遇點出發,兩個指標一次走一步。則快指標走到環的入口時(也就是快指標走了h的長度後),慢指標在環中也走了h的長度。而上述關係式表明,h= (m-1)(b+c) + b,即首先在環中繞了m-1圈,然後走了b個單位。

因此得到上述結論。

class

solution

listnode * fast = head,

*slow = head;

while

(fast && fast-

>next)}if

(!fast ||

!fast-

>next)

return

nullptr

; fast = head;

while

(fast != slow)

return slow;}}

;

leetcode 142 環形鍊錶

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...

leetcode 142環形鍊錶

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。example 輸入 head 3,2,0,4 pos 1...

Leetcode 142 環形鍊錶

問題重述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...