Bird
Raised Fist0
DSA Pythonprogramming~5 mins

Find Middle Element of Linked List in DSA Python - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Find Middle Element of Linked List
O(n)
Understanding Time Complexity

We want to understand how long it takes to find the middle element in a linked list as the list grows.

How does the time needed change when the list gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


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

def find_middle(head):
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    return slow.data
    

This code finds the middle element of a linked list by moving two pointers at different speeds.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while loop that moves the fast and slow pointers through the list.
  • How many times: The loop runs about half the number of nodes in the list.
How Execution Grows With Input

As the list size grows, the number of steps to find the middle grows roughly in half.

Input Size (n)Approx. Operations
105 steps
10050 steps
1000500 steps

Pattern observation: The steps increase linearly with the size of the list, but only about half as many steps are needed.

Final Time Complexity

Time Complexity: O(n)

This means the time to find the middle grows directly with the number of elements in the list.

Common Mistake

[X] Wrong: "Since the fast pointer jumps two steps, the time complexity is O(n/2), which is faster than O(n)."

[OK] Correct: We ignore constants in Big-O, so O(n/2) is the same as O(n). The time still grows linearly with input size.

Interview Connect

Understanding this pattern helps you solve problems efficiently by using two pointers moving at different speeds, a common technique in coding challenges.

Self-Check

"What if we used only one pointer to traverse the list twice instead of two pointers at once? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind finding the middle element of a singly linked list using the two-pointer technique?
easy
A. Use two pointers both moving one step at a time
B. Count all nodes first, then access the middle by index
C. Reverse the list and pick the first element
D. Use one slow pointer moving one step and one fast pointer moving two steps until fast reaches the end

Solution

  1. Step 1: Understand two-pointer movement

    The slow pointer moves one node at a time, while the fast pointer moves two nodes at a time.
  2. Step 2: Identify middle when fast pointer ends

    When the fast pointer reaches the end (null), the slow pointer will be at the middle node.
  3. Final Answer:

    Use one slow pointer moving one step and one fast pointer moving two steps until fast reaches the end -> Option D
  4. Quick Check:

    Two-pointer technique = slow one step, fast two steps [OK]
Hint: Move fast pointer twice as fast as slow to find middle [OK]
Common Mistakes:
  • Moving both pointers at the same speed
  • Counting nodes first instead of using pointers
  • Reversing the list unnecessarily
2. Which of the following Python code snippets correctly initializes pointers to find the middle of a linked list named head?
easy
A. slow = head\nfast = head
B. slow = head.next\nfast = head.next.next
C. slow = null\nfast = head
D. slow = head\nfast = null

Solution

  1. Step 1: Initialize both pointers at head

    To start traversal, both slow and fast pointers should begin at the head node.
  2. Step 2: Confirm correct initialization

    Setting slow = head and fast = head allows fast to move two steps and slow one step safely.
  3. Final Answer:

    slow = head\nfast = head -> Option A
  4. Quick Check:

    Both pointers start at head [OK]
Hint: Start both pointers at head node [OK]
Common Mistakes:
  • Starting slow or fast at null
  • Starting fast pointer too far ahead
  • Skipping initialization of pointers
3. What will be the output of the following code snippet that finds the middle element of a linked list?
class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

def find_middle(head):
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    return slow.val

# Creating linked list: 10 -> 20 -> 30 -> 40 -> 50
head = Node(10)
head.next = Node(20)
head.next.next = Node(30)
head.next.next.next = Node(40)
head.next.next.next.next = Node(50)

print(find_middle(head))
medium
A. 30
B. 20
C. 40
D. 50

Solution

  1. Step 1: Trace pointer movements

    Initially, slow=10, fast=10. After first loop: slow=20, fast=30. Second loop: slow=30, fast=50. Third loop ends as fast.next is null.
  2. Step 2: Identify slow pointer value

    Slow pointer is at node with value 30 when loop ends, so 30 is middle.
  3. Final Answer:

    30 -> Option A
  4. Quick Check:

    Middle element = 30 [OK]
Hint: Slow pointer lands on middle when fast reaches end [OK]
Common Mistakes:
  • Returning fast pointer value instead of slow
  • Off-by-one errors in loop condition
  • Confusing node values during tracing
4. Identify the error in the following code that attempts to find the middle element of a linked list and fix it:
def find_middle(head):
    slow = head
    fast = head
    while fast.next and fast.next.next:
        slow = slow.next
        fast = fast.next.next
    return slow.val
medium
A. Return fast.val instead of slow.val
B. Change loop condition to 'while fast and fast.next' to avoid NoneType errors
C. Initialize slow and fast to null instead of head
D. Remove the loop entirely and return head.val

Solution

  1. Step 1: Analyze loop condition

    The condition 'while fast.next and fast.next.next' can cause an error if fast is null initially.
  2. Step 2: Correct loop condition

    Changing it to 'while fast and fast.next' ensures fast is not null before accessing fast.next.
  3. Final Answer:

    Change loop condition to 'while fast and fast.next' to avoid NoneType errors -> Option B
  4. Quick Check:

    Safe loop condition = while fast and fast.next [OK]
Hint: Check fast pointer is not null before accessing next [OK]
Common Mistakes:
  • Accessing fast.next without checking fast
  • Returning wrong pointer's value
  • Incorrect pointer initialization
5. Given a linked list with an even number of nodes, which node will the two-pointer method return as the middle?
For example, in the list 1 -> 2 -> 3 -> 4 -> null, what will be the middle element returned by the standard two-pointer approach?
hard
A. Node with value 2 (the first middle)
B. Node with value 1 (head node)
C. Node with value 3 (the second middle)
D. Node with value 4 (last node)

Solution

  1. Step 1: Trace pointers on even-length list

    Start: slow=1, fast=1. Loop 1: slow=2, fast=3. Loop 2: fast tries to move two steps but reaches end, loop stops.
  2. Step 2: Identify slow pointer position

    Slow pointer is at node with value 3 when loop ends, which is the second middle node.
  3. Final Answer:

    Node with value 3 (the second middle) -> Option C
  4. Quick Check:

    Two-pointer returns second middle in even list [OK]
Hint: Two-pointer method returns second middle in even-length lists [OK]
Common Mistakes:
  • Assuming it returns first middle node
  • Confusing head or last node as middle
  • Not tracing pointer steps carefully
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