로고조성현

0141 Linked List Cycle

Solved at: 2022-10-23

Question

Given head, the head of a linked list, determine if the linked list has a cycle.

There is a cycle in a linked list if some node in the list can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that the tail's next pointer is connected to. Note that pos is not passed as a parameter.

Return true if there is a cycle in the linked list. Otherwise, return false.

Solution

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        seen = {}
        while True:
            if head == None:
                break
            if head not in seen:
                seen[head] = True
            else:
                return True
            head = head.next
        return False

Results

Runtime

  • 141 ms, faster than 9.68% of Python3 online submissions for the Linked List Cycle.

Memory Usage

  • 17.9 MB, less than 10.44% of Python3 online submissions for the Linked List Cycle.

Improved

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        slow = head
        fast = head
        while fast != None and fast.next != None:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                return True
        return False

Results

Runtime

  • 137 ms, faster than 12.14% of Python3 online submissions for the Linked List Cycle.

Memory Usage

  • 17.6 MB, less than 67.24% of Python3 online submissions for the Linked List Cycle.

Complexity Analysis

  • Time: O(n)O(n)
  • Space: O(1)O(1)