剛開始文章發到了牛客的題解裡面了,但是原來的圖被我誤刪了,只能用牛客上的圖,這才有了雙重水印,沒有盜圖哈?
環形鍊錶 ii
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。
為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。
說明:不允許修改給定的鍊錶。
高階:你是否可以使用 o(1) 空間解決此題?
示例 1:
輸入:head = [3,2,0,-4], pos = 1示例 2:輸出:返回索引為 1 的鍊錶節點
解釋:鍊錶中有乙個環,其尾部連線到第二個節點。
輸入:head = [1,2], pos = 0示例 3:輸出:返回索引為 0 的鍊錶節點
解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。
輸入:head = [1], pos = -1判斷乙個鍊錶是否存在環,有乙個floyd判圈法輸出:返回 null
解釋:鍊錶中沒有環。
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'
這裡的快慢指標分別用hare
和tortoise
來指代。
判定存在圈的條件是快慢指標重合
,也就是上圖中的烏龜和兔子能夠走到一起去。讓兔子每次走兩步,烏龜每次走一步。
而本題我們要求返回這個鍊錶環的入口結點。
網上的好多回答都是基於列未知數方程判定關係,如果在面試的過程中讓我現場第一次推算這個過程(現在是會了,也是做的次數多了才記住了)我是不行的,必須得找到乙個更加容易理解的方式。
這裡我把環展開,讓烏龜和兔子在展開的路上跑,兔子的速度是烏龜的二倍。
紅色的代表環,分割線分割重複的環,也就是他們多跑乙個環我就多展開乙個,上圖顯示的就是他們所跑的真正路程。當烏龜距離入口的距離與兔子距離入口的距離相同的時候,他們就算是相遇了。
而且兔子跑的總路程應該是烏龜的二倍。
這時候我們派出另乙隻紅色烏龜從頭開始跑,當這紅色只烏龜跑完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 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...