Bird
Raised Fist0
DSA Pythonprogramming~5 mins

Detect Cycle in Linked List Floyd's Algorithm in DSA Python - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Detect Cycle in Linked List Floyd's Algorithm
O(n)
Understanding Time Complexity

We want to understand how the time needed to detect a cycle in a linked list grows as the list gets longer.

Specifically, how many steps does Floyd's Algorithm take to find a cycle or confirm there is none?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

def has_cycle(head):
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False
    

This code uses two pointers moving at different speeds to detect if a linked list has a cycle.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while loop that moves the slow pointer one step and the fast pointer two steps each time.
  • How many times: At most, the loop runs once per node until the fast pointer reaches the end or the pointers meet.
How Execution Grows With Input

As the linked list grows, the number of steps grows roughly in a straight line with the number of nodes.

Input Size (n)Approx. Operations
10About 10 steps
100About 100 steps
1000About 1000 steps

Pattern observation: The steps increase directly with the number of nodes, so doubling nodes roughly doubles steps.

Final Time Complexity

Time Complexity: O(n)

This means the time to detect a cycle grows linearly with the size of the linked list.

Common Mistake

[X] Wrong: "Because the fast pointer moves twice as fast, the algorithm runs in constant time O(1)."

[OK] Correct: Even though the fast pointer moves faster, it still needs to traverse nodes, so the total steps depend on the list size.

Interview Connect

Understanding this linear time complexity helps you explain why Floyd's Algorithm is efficient and preferred for cycle detection in interviews.

Self-Check

"What if we used a hash set to store visited nodes instead? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind Floyd's Cycle Detection Algorithm in a linked list?
easy
A. Use two pointers moving at different speeds to detect a cycle
B. Count the number of nodes and check if it exceeds a limit
C. Reverse the linked list and check if it matches the original
D. Use a hash set to store visited nodes and check for repeats

Solution

  1. Step 1: Understand Floyd's algorithm concept

    It uses two pointers, one moving fast (two steps) and one slow (one step).
  2. Step 2: Detect cycle by pointer meeting

    If the fast pointer meets the slow pointer, a cycle exists in the linked list.
  3. Final Answer:

    Use two pointers moving at different speeds to detect a cycle -> Option A
  4. Quick Check:

    Two pointers at different speeds = cycle detection [OK]
Hint: Two pointers, slow and fast, meet if cycle exists [OK]
Common Mistakes:
  • Thinking counting nodes detects cycle
  • Assuming reversing list helps detect cycle
  • Confusing hash set method with Floyd's algorithm
2. Which of the following is the correct way to move the fast pointer in Floyd's cycle detection?
easy
A. fast = fast.next
B. fast = fast.next.next
C. fast = fast.next.next.next
D. fast = fast.next.prev

Solution

  1. Step 1: Understand fast pointer movement

    The fast pointer moves two steps at a time to catch up with the slow pointer.
  2. Step 2: Identify correct syntax

    Moving two nodes ahead is done by fast = fast.next.next.
  3. Final Answer:

    fast = fast.next.next -> Option B
  4. Quick Check:

    Fast pointer moves two steps = fast.next.next [OK]
Hint: Fast pointer moves two nodes ahead using next.next [OK]
Common Mistakes:
  • Moving fast pointer only one step
  • Trying to move fast pointer three steps
  • Using invalid pointer like prev in singly linked list
3. What will be the output of the following code snippet?
class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = head.next  # cycle here

def has_cycle(head):
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False

print(has_cycle(head))
medium
A. True
B. None
C. False
D. Error

Solution

  1. Step 1: Analyze linked list structure

    Nodes 1->2->3 and then 3 points back to 2, creating a cycle.
  2. Step 2: Trace Floyd's algorithm

    Slow and fast pointers will meet inside the cycle, so function returns True.
  3. Final Answer:

    True -> Option A
  4. Quick Check:

    Cycle exists, so output = True [OK]
Hint: Cycle means slow and fast pointers meet, so return True [OK]
Common Mistakes:
  • Ignoring cycle creation line
  • Assuming no cycle returns True
  • Confusing None return with False
4. Find the error in the following Floyd's cycle detection code:
def detect_cycle(head):
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next
        if slow == fast:
            return True
    return False
medium
A. No return statement for cycle detection
B. slow pointer moves two steps instead of one
C. Missing initialization of slow pointer
D. fast pointer moves only one step instead of two

Solution

  1. Step 1: Check pointer movements

    Fast pointer should move two steps (fast = fast.next.next), but here it moves one step.
  2. Step 2: Understand impact on cycle detection

    Moving one step slows fast pointer, so it may never meet slow pointer correctly.
  3. Final Answer:

    fast pointer moves only one step instead of two -> Option D
  4. Quick Check:

    Fast pointer must move two steps [OK]
Hint: Fast pointer must jump two nodes, not one [OK]
Common Mistakes:
  • Moving fast pointer one step
  • Confusing slow pointer movement
  • Forgetting to check fast and fast.next
5. Given a linked list where the last node points back to the head (forming a cycle), how can Floyd's algorithm be adapted to find the node where the cycle begins?
hard
A. Use a hash set to store nodes and return the first repeated node
B. Count nodes until slow and fast meet, then return count as cycle start
C. After detecting cycle, reset slow to head and move both pointers one step until they meet
D. Reverse the linked list and check where reversal breaks

Solution

  1. Step 1: Detect cycle using Floyd's algorithm

    Use slow and fast pointers to find meeting point inside cycle.
  2. Step 2: Find cycle start node

    Reset slow to head, then move slow and fast one step at a time until they meet; meeting point is cycle start.
  3. Final Answer:

    After detecting cycle, reset slow to head and move both pointers one step until they meet -> Option C
  4. Quick Check:

    Reset slow and move both pointers one step to find cycle start [OK]
Hint: Reset slow to head, move both one step to find cycle start [OK]
Common Mistakes:
  • Trying to count nodes to find cycle start
  • Using reversal which doesn't help here
  • Confusing hash set method with Floyd's approach
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard