LeetCode142 環形鍊錶 II

2021-09-19 04:18:54 字數 1546 閱讀 7115

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

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

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

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:tail connects to node index 1

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

輸入:head = [1,2], pos = 0

輸出:tail connects to node index 0

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

輸入:head = [1], pos = -1

輸出:no cycle

解釋:鍊錶中沒有環。

高階:使用set去重,然後判讀set的大小與鍊錶長度是否一致,不一致則表示剛剛放入的集合的那個node是重複的

c++**

class solution 

return head;

}};

執行效率:

設定兩個指標,乙個是快指標fast、乙個是慢指標slow,將快指標的移動速度設為慢指標的兩倍

設定迴圈,若在某次迴圈中fast追上了slow(實際上是超了一圈),表明這個鍊錶存在回環

之後需要找到回環的第乙個位置,怎麼找呢?

假設入口為節點a,它離鍊錶中的第乙個節點的距離為a,快指標與慢指標相遇的節點為b,設節點b離回環的第乙個節點的距離為b,則節點b離鍊錶的第乙個節點的距離為:(a+b)

我們知道此時快指標fast經過的節點數量是慢指標slow的兩倍,即:2*(a+b)

於是用快指標走過的距離減去慢指標走過的距離,得到的就是快指標比慢指標多走的距離,這裡,我們知道,快指標與慢指標相遇時,快指標一定比慢指標多走了一圈回環,因此可知回環的長度為:(a+b)

我們想要知道的是節點a,現在節點a離第乙個節點的距離為a,而慢指標所在的節點b現在離節點的距離是b,根據回環長度,可知慢指標再經過a個節點後便能到達節點a,而第乙個節點(head)經過a個節點後也恰好到達節點a,於是儘管我們並不知道a是多少,但是可以利用這個條件判斷是否到達a點

c++**:

class solution 	

} if (hascycle)

return head;

} return null;

}};

執行效率:

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 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...