Leetcode 142. Linked List Cycle II

GoodJobJasper發表於2020-12-26

Leetcode 142. Linked List Cycle II

地址:Leetcode 142. linked list Cycle II

問題描述:檢測連結串列是否存在環,是的話返回環入口,否則返回None.

這道題有兩個思路,一個是經典的快慢指標的思路,另外一個是利用hashMap來記住已經訪問過的Node。

思路一:檢測到環的時候,令慢指標指向head,然後fast 和 slow指標皆一次移動一個,到他們再次相遇的時候就是環的入口。 簡單證明如下,來自Leetcode網友:

Leetcode 142. Linked List Cycle II

程式碼:

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連結串列是否存在環,如果存在,則兩個連結串列相交,而檢測出來的依賴環入口即為相交的第一個點。
  • 求有序連結串列中求出其中位數,這種問題也是設定快慢指標,當快指標到底連結串列尾部的時候,慢指標剛好指向連結串列中間的結點。

相關文章