LeetCode筆記 142 環形鍊錶II

2021-10-21 02:57:01 字數 2070 閱讀 4901

剛開始文章發到了牛客的題解裡面了,但是原來的圖被我誤刪了,只能用牛客上的圖,這才有了雙重水印,沒有盜圖哈?

環形鍊錶 ii

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

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。

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

高階:你是否可以使用 o(1) 空間解決此題?

示例 1:

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

輸出:返回索引為 1 的鍊錶節點

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

示例 2:

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

輸出:返回索引為 0 的鍊錶節點

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

示例 3:

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

輸出:返回 null

解釋:鍊錶中沒有環。

判斷乙個鍊錶是否存在環,有乙個floyd判圈法

tortoise = top

hare = top

forever:

if hare == end :

return

'no loop found'

hare = hare.next

if hare == end :

return

'no loop found'

hare = hare.next

tortoise = tortoise.next

if hare == tortoise:

return

'loop found'

這裡的快慢指標分別用haretortoise來指代。

判定存在圈的條件是快慢指標重合,也就是上圖中的烏龜和兔子能夠走到一起去。讓兔子每次走兩步,烏龜每次走一步。

而本題我們要求返回這個鍊錶環的入口結點。

網上的好多回答都是基於列未知數方程判定關係,如果在面試的過程中讓我現場第一次推算這個過程(現在是會了,也是做的次數多了才記住了)我是不行的,必須得找到乙個更加容易理解的方式。

這裡我把環展開,讓烏龜和兔子在展開的路上跑,兔子的速度是烏龜的二倍。

紅色的代表環,分割線分割重複的環,也就是他們多跑乙個環我就多展開乙個,上圖顯示的就是他們所跑的真正路程。當烏龜距離入口的距離與兔子距離入口的距離相同的時候,他們就算是相遇了。

而且兔子跑的總路程應該是烏龜的二倍。

這時候我們派出另乙隻紅色烏龜從頭開始跑,當這紅色只烏龜跑完a-b的路程的時候,綠色烏龜也跑到了a-b到達環的入口處了。

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