142 環形鍊錶2

2021-10-09 18:39:07 字數 1649 閱讀 2226

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

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

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

示例 1:

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

輸出:tail connects to node index 1

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

示例 2:

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

輸出:tail connects to node index 0

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

示例 3:

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

輸出:no cycle

解釋:鍊錶中沒有環。

高階:你是否可以不用額外空間解決此題?

思考

這一題啊,第一步首先判斷它是不是環,這點跟環形鍊錶1一毛一樣。

當fast和slow相遇的時候,說明是個環。此時把fast放到開頭。

然後fast和slow每次都走一步,再次相遇的地點就是環的開頭。

演算法叫弗洛伊德演算法,下面看看原理

1.一開始slow和fast都指向起點,slow一次走一步,fast一次走兩步。

2.slow走了l步到達了環的開頭,此時fast走了2l步。假設環的長度為d.fast和slow相差了d-l步。

3.slow再走d-l步,此時fast正好趕上來了,兩者相遇,說明有環。此時slow距離環開頭差d-(d-l)= l 步。

4.把fast放到開頭。slow和fast每次都走一步。

5.slow經過l步到達環的開頭,fast正好也走了環的開頭。返回fast.

**實現

/**

* definition for singly-linked list.

* function listnode(val)

*//**

* @param head

* @return

*/var detectcycle = function(head)

//判斷是否有環

let iscycle = false

let slow = head

let fast = head

while (fast.next !== null && fast.next.next !== null)

}//檢查是否有環

if (!iscycle)

fast = head

while (fast !== slow)

return fast

};

142環形鍊錶

題目描述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。題解思路 採用雙指標法,設定乙個快指標,乙個慢指標,它們採取的步長不一樣,如果相遇,就代表鍊錶一定存在環 與環形鍊錶 一致 然後在前邊的迴圈裡利用慢指標尋找入環的第乙個節點,採用標記法,訪問過就標記其val值為99...

142 環形鍊錶

快慢指標,好像和之前的某道題相似 definition for singly linked list.struct listnode struct listnode detectcycle struct listnode head newlow newlow next low low next re...

力扣141 環形鍊錶 142環形鍊錶2

方法一 雜湊表 思路及演算法 最容易想到的方法是遍歷所有節點,每次遍歷到乙個節點時,判斷該節點此前是否被訪問過。具體地,我們可以使用雜湊表來儲存所有已經訪問過的節點。每次我們到達乙個節點,如果該節點已經存在於雜湊表中,則說明該鍊錶是環形鍊錶,否則就將該節點加入雜湊表中。重複這一過程,直到我們遍歷完整...