Crushing Tech Interviews with the Fast and Slow Pointer Pattern

·

2 min read

This is quite a nifty pattern to apply to linked lists (also arrays and other sequences).

Also known as:

  • Hare and Tortoise algorithm.
  • Floyd's algorithm.

The pattern is famously used for cycle detection but can be used to solve other sorts of problems too. This is such a good example of a simple but very effective algorithm.

By moving two pointers at different speeds, the algorithm proves that the two pointers are bound to meet. Here's a great StackOverflow post on the proof behind the algorithm: https://cs.stackexchange.com/a/45540

So, let's solve the following question:

Given the head of a singly-linked list, how would you go about determining whether there is a cycle in it or not?

image.png

Cast your mind back to the old fable of the tortoise and the hare. Imagine them both on the track (In our case, the linked list). Now, we know that if the track is circular, then the faster hare will be able to eventually catch up and lap the tortoise from behind eventually. This is the same concept behind the tortoise and hare algorithm.

We traverse the linked list with a slow and fast pointer. At each iteration of the traversal, the slower pointer moves one element forward and the fast pointer moves two elements forward. If there's a cycle, they are eventually going to meet.

So what happens if there isn't a cycle in the linked list? Well, in that case the fast pointer will reach the tail of the linked list and hit a null value (indicating the tail) and we will conclude that the linked list doesn't have a cycle.

Pretty nifty eh?

Here's a visual representation to get your head around it:

image.png

And here's some python code:

def has_cycle(head: LinkedListNode):
    slow, fast = head, head

    while fast and fast.next:
        fast = fast.next.next
        slow = slow.next

        if slow == fast:
            return True

    return False

And that's it! Like I said before: Simple yet effective.

Some extra questions for you to have a go at:

https://leetcode.com/problems/middle-of-the-linked-list/ (Easy)

https://leetcode.com/problems/happy-number/ (Easy)

https://leetcode.com/problems/linked-list-cycle-ii/ (Medium)

If you enjoyed this article, please go support the people over at educative.io/courses/grokking-the-coding-in... I've based this blog post on their content.