Leetcode 142. Linked List Cycle II
地址:Leetcode 142. linked list Cycle II
問題描述:檢測連結串列是否存在環,是的話返回環入口,否則返回None.
這道題有兩個思路,一個是經典的快慢指標的思路,另外一個是利用hashMap來記住已經訪問過的Node。
思路一:檢測到環的時候,令慢指標指向head,然後fast 和 slow指標皆一次移動一個,到他們再次相遇的時候就是環的入口。 簡單證明如下,來自Leetcode網友:
程式碼:
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return None
slow,fast = head,head
while(fast and fast.next):
slow = slow.next
fast = fast.next.next
if (slow == fast):
slow = head
while(slow!=fast):
slow = slow.next
fast = fast.next
return slow #返回入口節點
return None
複製程式碼
思路二:利用一個hashMap當再次訪問節點的時候就是環的入口。
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
visited = {}
p = head
while(p):
if visited.get(p) != None:
return p
else:
visited[p] = True
p = p.next
return None
複製程式碼
最後總結來自:will_duan部落格
目前我遇到的主要有以下幾點應用:
- 如上面第一題,判斷一個連結串列是否有環
- 如上面第二題,求一個連結串列是否存在環,如果存在,則求出環的入口結點
- 另一個應用是求連結串列是否存在環的變式,如給定兩個連結串列A和B,判斷兩個連結串列是否相交,解決方法就是將A連結串列尾節點指向頭結點形成一個環,檢測B連結串列是否存在環,如果存在,則兩個連結串列相交,而檢測出來的依賴環入口即為相交的第一個點。
- 求有序連結串列中求出其中位數,這種問題也是設定快慢指標,當快指標到底連結串列尾部的時候,慢指標剛好指向連結串列中間的結點。