leetcode 141 142環形鍊錶

2021-09-12 01:15:35 字數 2619 閱讀 9377

給定乙個鍊錶,判斷鍊錶中是否有環。

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

示例 1:

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

輸出:true

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

雙指標法:

兩個指標乙個遍歷速度快,乙個遍歷速度慢,如果有環,則快指標一定會趕上慢指標與之相遇(想象一下兩個人圍著操場跑步,跑的快的人一定會在後來追上跑的慢的人)。這裡快指標走兩步,慢指標走一步

python實現:

class solution(object):

def hascycle(self, head):

""":type head: listnode

:rtype: bool

"""fast = slow = head

while fast and fast.next:

fast = fast.next.next

slow = slow.next

if fast == slow:

return true

return false

環形鍊錶ii

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

解釋:鍊錶中沒有環。

思路:先用快慢指標判斷是否存在環,如果存在環再進節點判斷。

這裡要注意的是,快慢指標相遇的節點不一定是環開始的節點,假設環開始的節點是a,對於存在的環的鍊錶,假設快慢指標在進入環之前從head走到a的路程為a,進入環之後離環開始的節點長度為b,我們想要得到的就是a,

而a+b就是慢指標走過的節點數,而fast因為一直是slow的兩倍速度,所以fast走過的路程是slow的兩倍,那麼快指標走過的路程就是2*(a+b),要理解這個地方!!!

注意的是,fast和slow現在都在同乙個節點假設為b,那麼如果slow繼續走一圈走到b還需要走a+b(fast走過的路程-slow走過的路程)的路程,而a到b的路程是b,所以slow還需要再走a這個長度就能到節點a,同時,又因為頭指標到a的距離也為a,所以所以(重點來了!!)頭指標到a的距離和slow到a的距離都是a!那麼我們只需要使head和slow同時往前走a這個長度就能在入環節點a處相遇,就能返回當前值!

class solution(object):

def detectcycle(self, head):

""":type head: listnode

:rtype: listnode

"""# 先判斷是否有環

fast=slow=head

# temp=head

while fast and fast.next:

fast=fast.next.next

slow=slow.next

if fast==slow: # 相遇的地方不一定是交點

temp=head # temp從head開始走

while slow!=temp: # 兩個一起往前走a的長度然後在入環節點處相遇

slow=slow.next

temp=temp.next

return slow

return none

leetcode 141 142 環形鍊錶及拓展

給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?節點類 class listnode 1 使用額外空間來判斷鍊錶中是否有環 思路 遍歷整個鍊錶,將每一次遍歷的節點存入set中,利用set存入相同元素返回false的特性,判斷鍊錶中是否有環。public boolean hasc...

鍊錶中是否有環141 142

判斷鍊錶中是否有環 設定兩個指標,乙個快乙個慢 每次慢的走一步,快的走兩步,如果相遇就說明有環 public boolean hascycle listnode head else return false return false 和上面的區別是如果有環,要返回環的入口結點,如果沒環就返回空 先假...

Leetcode 判斷有環鏈表的環長度 2

思路 當兩個指標相遇,證明鍊錶有環的時候,讓兩個指標從相遇點繼續迴圈前進,並統計前進的迴圈次數,直到兩個指標第2次相遇,此時,統計出來的前進次數就是環數。思考一下 假設兩指標分為為p1,p2,則指標p2每次比p1多走一步,兩者的速度差為1步,當兩個指標再次相遇,p2比p1多走了1圈,因此 環長 每一...