linked list cycle

🏠

Write a function that detects a cycle in a linked-list, and returns the node where the cycle starts.

Solution

Detecting the cycle

Detecting whether a linked-list has a cycle in it, in O(1) space has an interesting solution: one can simply iterate over it with fast and slow pointers.

The fast and slow pointers can meet anywhere within the cycle. They do not have to necessarily meet on node 4. Finding the starting node of the cycle involves an extra step.

Finding the start of the cycle

Finding the start of the cycle simply requires simultaneously stepping from the intersection node (4) and the head of the list.

 1def detectCycle(head):
 2 slow = fast = head
 3 while fast and fast.next:
 4     fast, slow = fast.next.next, slow.next
 5     if slow == fast:
 6         break
 7
 8 if fast and fast.next:
 9     slow = head
10     while slow != fast:
11         slow, fast = slow.next, fast.next
12     return slow

Time and Space Complexity