LeetCode演算法題142 環形鍊錶 II解析

2021-09-11 17:48:00 字數 1821 閱讀 5505

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 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

解釋:鍊錶中沒有環。

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

首先自然是想到了使用乙個列表來儲存遍歷過的節點,如果首次遍歷到表中有的點,那麼這個點就是環的起點。但是這個非常耗時間(這裡用python編寫)。另外可以使用快慢指標,就不需要使用額外空間了,快指標是慢指標的兩倍速度,當其相遇時,使慢指標從頭開始,快指標也一步步走,再次相遇時就是環開頭節點了,這時因為快指標是慢指標的兩倍速度,而且快指標比慢指標多走一圈,所以頭節點到環開頭的距離加上環到相遇節點的距離等於環的距離,即s=x1+x2,f=x1+x2+c,f=2s,因此c=x1+x2,所以慢指標再走x1等於快指標再走c-x2。(這個思想用c++編寫)

c++源**:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solutionif(

!fast ||

!fast-

>next)

return

null

; slow = head;

while

(slow!=fast)

return slow;}}

;

python3源**:

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

(object):

defdetectcycle

(self, head)

:"""

:type head: listnode

:rtype: listnode

"""m =

while head!=

none

:if head in m:

return head

head = head.

next

return

none

Leetcode刷題筆記 142 環形鍊錶II

題目 給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為...

leetcode 142 環形鍊錶

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...

leetcode 142環形鍊錶

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