142 環形鍊錶 II

2021-10-20 10:07:27 字數 1633 閱讀 5573

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

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

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

高階:

示例 1:

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

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

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

示例 2:

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

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

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

示例 3:

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

輸出:返回 null

解釋:鍊錶中沒有環。

題解:雙指標。參考 環形鍊錶 中判斷是否存在環的方法。

假設在s在走到環的入口處時,走了x步,那麼f在環中的某個位置,走了2 * x步,設f距離環入口還剩y步,假設這個環很大,那麼其長度為x + y。那麼當sy步時,f走了2 * y步,此時sf第一次相遇,f距離環的入口還剩x步。

在第一次相遇時,將s移動到煉表頭節點,然後兩個指標一起移動x步,即可走到環的入口。

時間複雜度:o(n

)o(n)

o(n)

額外空間複雜度:o(1

)o(1)

o(1)

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

s = head, f = f-

>next;

while

( s != f )

return s;}}

;/*記憶體:7.4mb,擊敗:93.56%

*/

142 環形鍊錶 II

還是快慢指標的問題,當發現有環時,將fast指向head,fast一次向前移動乙個節點,則fast和slow一定會在環的入口相遇.證明 設s為slow指標走的節點個數,m為環的入口距head的位置 則第一次相遇時,fast和head相對於環入口的位置相同,fast在環中的相對於環入口的位置在 2s ...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.struct listnode class solution node set.insert...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...