給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 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。極限情況是你們倆從同一地點出發,當你跑完一圈後,你們倆在原來的位置相遇。
上圖是乙個環形鍊錶,假設快慢指標在*處相遇,環中逆時針旋轉。相遇點距離環入口的距離分別是b
和c
。假設在相遇時,快指標已經在環中轉過了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 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...