給定乙個鍊錶,判斷鍊錶中是否有環。
為了表示給定鍊錶中的環,我們使用整數 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圈,因此 環長 每一...