以前碰到的時候沒有仔細看,用了set硬解,這題真正想考的應該是快慢指標。

題目

輸入一個單向linked list,找出環的入口,若無則回傳null。

解法

使用快慢指標,先判斷有無環。
若有環,環入口為E,相遇點為M。
因fast是兩倍速,且又比slow多走一圈,head到E+E到M=環長度,
也就是head到E=M再次回到E,所以從再從head和M同時往前, 最終會在E點相遇。

這篇文有很清楚的解釋,十分感謝!

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        fast = slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                break

        if not fast or not fast.next:
            return None

        slow = head
        while fast != slow:
            fast = fast.next
            slow = slow.next

        return fast