###### tags: ` leetcode` 142.Linked List Cycle II === 想法: 只要不是有迴圈的,就直接斷出。 有迴圈的就直接去找,有就回給去。 解法: 此題是有兩種解法。 A、暴力解 一個之前走過的位置通通放到一個table裡面,若table裡面有重複的,就直接print出來。 B、迴圈解 使用快慢指針。這個迴圈開始處離head有A步,走了B步快慢指針在迴圈裏頭交會,再走C步會回到迴圈起始點。 然後把慢指針拉回head,快慢指針開始一次都只走一格,最後交會在迴圈起始處。 ``` 推論: 慢指針: a+b 快指針(b+c是一圈,他應該繞了好幾圈才碰到): a+n(b+c)+b 2(a+b)=a+n(b+c)+b a=(n-1)b+c 拉回來之後一次走一個,確認最終快指針會繞幾圈+C的一個距離,在起始點一起相會。 ``` 程式碼: A、 ``` # 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 """ cur = head lookup = set() while cur: if cur in lookup: return cur lookup.add(cur) cur=cur.next return None ``` B、 ``` class Solution(object): def detectCycle(self, head): """ :type head: ListNode :rtype: ListNode """ // 若根本一開始就NULL 也不用測 if not head: return slow,fast = head,head while fast.next and fast.next.next: slow = slow.next fast = fast.next.next if fast == slow: break //若發現沒有迴圈,也直接退出 if not fast.next or not fast.next.next: return slow = head while slow.next: if fast == slow: return slow slow=slow.next fast=fast.next return ```