Leetcode 142 環形鍊錶II

2021-10-03 18:32:40 字數 1699 閱讀 1276

前言:leetcode 141是判斷鍊錶中有沒有環,直接快慢雙指標走,如果有環,兩個指標一定會相交。

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

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

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

高階:

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

基礎做法:利用額外空間set或是list

乙個指標,節點存在就把節點存進set裡,如果有環,那麼入環節點會再一次被訪問到,但是set中已經有這個節點了,所以直接返回該節點。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def detectcycle(self, head):

""":type head: listnode

:rtype: listnode

"""if not head or not head.next:

return none

s = # 利用set來做,list其實也行,反正不要出現重複節點

while head.next:

head = head.next

if head in s:

return head

else:

s.add(head)

return none

高階解法:快慢雙指標(有一點小trick)

還是兩個指標slow和fast,假設環外有a個節點,環有b個節點。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def detectcycle(self, head):

""":type head: listnode

:rtype: listnode

"""slow = head

fast = head

while true:

if not fast or not fast.next:

return none

slow = slow.next

fast = fast.next.next

if slow == fast:

break

fast = head

while fast != slow:

slow = slow.next

fast = fast.next

return slow

參考:

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