Bird
Raised Fist0
DSA Pythonprogramming~5 mins

Merge Overlapping Intervals in DSA Python - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Merge Overlapping Intervals
O(n log n)
Understanding Time Complexity

We want to understand how the time needed to merge overlapping intervals changes as the number of intervals grows.

Specifically, how does the work increase when we have more intervals to merge?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

def merge_intervals(intervals):
    intervals.sort(key=lambda x: x[0])
    merged = []
    for interval in intervals:
        if not merged or merged[-1][1] < interval[0]:
            merged.append(interval)
        else:
            merged[-1][1] = max(merged[-1][1], interval[1])
    return merged

This code sorts intervals by start time and then merges any that overlap into one.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Sorting the list of intervals and then looping through each interval once.
  • How many times: Sorting takes multiple comparisons depending on number of intervals (n), and the loop runs once for each interval (n times).
How Execution Grows With Input

Sorting grows faster than just looping, so it dominates the time.

Input Size (n)Approx. Operations
10About 10 log 10 ≈ 33 operations
100About 100 log 100 ≈ 664 operations
1000About 1000 log 1000 ≈ 9966 operations

Pattern observation: As input size grows, operations grow a bit more than linearly because of sorting.

Final Time Complexity

Time Complexity: O(n log n)

This means the time grows a bit faster than the number of intervals because sorting takes extra work, then merging is quick.

Common Mistake

[X] Wrong: "Merging intervals takes only O(n) time because we just loop once."

[OK] Correct: Sorting the intervals first takes more time than just looping, so the total time is dominated by sorting, not just the loop.

Interview Connect

Understanding this time complexity helps you explain why sorting is important before merging and shows you can analyze combined steps clearly.

Self-Check

"What if the intervals were already sorted? How would the time complexity change?"

Practice

(1/5)
1. What is the main purpose of merging overlapping intervals in a list of intervals?
easy
A. To remove all intervals that have the same start and end points
B. To sort intervals by their start time only
C. To combine intervals that overlap into a single continuous interval
D. To split intervals into smaller parts

Solution

  1. Step 1: Understand overlapping intervals

    Overlapping intervals share some common range, so merging combines them into one continuous interval.
  2. Step 2: Purpose of merging

    Merging reduces multiple overlapping intervals into fewer intervals without overlaps.
  3. Final Answer:

    To combine intervals that overlap into a single continuous interval -> Option C
  4. Quick Check:

    Merging = Combining overlaps [OK]
Hint: Merging means joining overlapping intervals into one [OK]
Common Mistakes:
  • Thinking merging means sorting only
  • Confusing merging with removing duplicates
  • Assuming intervals are split instead of combined
2. Which of the following Python code snippets correctly sorts a list of intervals by their start time before merging?
easy
A. intervals.sort(key=lambda x: x[0], reverse=True)
B. intervals.sort(key=lambda x: x[0])
C. sorted(intervals)
D. intervals.sort(key=lambda x: x[1])

Solution

  1. Step 1: Identify sorting key for intervals

    We sort intervals by their start time, which is the first element in each interval.
  2. Step 2: Check code correctness

    Using intervals.sort(key=lambda x: x[0]) sorts by start time ascending, which is correct.
  3. Final Answer:

    intervals.sort(key=lambda x: x[0]) -> Option B
  4. Quick Check:

    Sort by start time = key x[0] [OK]
Hint: Sort intervals by first element before merging [OK]
Common Mistakes:
  • Sorting by end time instead of start time
  • Using sorted(intervals) which returns new list without modifying original
  • Sorting in reverse order before merging
3. What is the output of the following Python code?
intervals = [[1,3],[2,6],[8,10],[15,18]]
intervals.sort(key=lambda x: x[0])
merged = []
for interval in intervals:
    if not merged or merged[-1][1] < interval[0]:
        merged.append(interval)
    else:
        merged[-1][1] = max(merged[-1][1], interval[1])
print(merged)
medium
A. [[1, 6], [8, 10], [15, 18]]
B. [[1, 3], [2, 6], [8, 10], [15, 18]]
C. [[1, 6], [2, 6], [8, 10], [15, 18]]
D. [[1, 3], [8, 10], [15, 18]]

Solution

  1. Step 1: Sort intervals by start time

    Intervals after sorting: [[1,3],[2,6],[8,10],[15,18]] (already sorted)
  2. Step 2: Merge overlapping intervals

    First interval [1,3] added. Next [2,6] overlaps with [1,3], merged to [1,6]. Then [8,10] no overlap, added. Finally [15,18] no overlap, added.
  3. Final Answer:

    [[1, 6], [8, 10], [15, 18]] -> Option A
  4. Quick Check:

    Merged intervals = [[1,6],[8,10],[15,18]] [OK]
Hint: Merge if current start ≤ last merged end [OK]
Common Mistakes:
  • Not updating the end of merged interval
  • Appending intervals without merging
  • Incorrectly sorting intervals
4. Find the error in the following code that attempts to merge overlapping intervals:
def merge_intervals(intervals):
    intervals.sort()
    merged = []
    for i in range(len(intervals)):
        if not merged or merged[-1][1] < intervals[i][0]:
            merged.append(intervals[i])
        else:
            merged[-1][1] = max(merged[-1][1], intervals[i][1])
    return merged

print(merge_intervals([(1,4),(2,3)]))
medium
A. Not checking if intervals list is empty before sorting
B. Sorting intervals without a key may cause incorrect order
C. Using range(len(intervals)) instead of iterating directly over intervals
D. Modifying merged[-1][1] directly causes an error because tuples are immutable

Solution

  1. Step 1: Identify data type of intervals elements

    Intervals are list of tuples like [(1,4),(2,3)], tuples are immutable.
  2. Step 2: Trace the merging process

    After sorting, append first tuple (1,4) to merged. Second overlaps, attempt merged[-1][1] = max(4,3) fails: 'tuple' object does not support item assignment.
  3. Final Answer:

    Modifying merged[-1][1] directly causes an error because tuples are immutable -> Option D
  4. Quick Check:

    Tuples immutable, can't modify [OK]
Hint: Check if intervals are tuples before modifying elements [OK]
Common Mistakes:
  • Assuming all intervals are lists when they might be tuples
  • Ignoring immutability errors
  • Thinking sorting always needs a key
5. Given a list of intervals where some intervals are nested inside others, how would you modify the merge algorithm to handle intervals like [[1,10],[2,5],[6,9],[11,15]] to produce the correct merged output?
hard
A. Sort intervals by start time and merge by extending the end to max of overlapping intervals
B. Sort intervals by end time and merge by extending the start to min of overlapping intervals
C. Remove nested intervals before merging to avoid duplicates
D. Merge only intervals that have exactly the same start or end points

Solution

  1. Step 1: Sort intervals by start time

    Sorting ensures intervals are processed in order, e.g. [[1,10],[2,5],[6,9],[11,15]].
  2. Step 2: Merge by extending end to max of overlapping intervals

    When intervals overlap or are nested, update the end of merged interval to the maximum end value.
  3. Step 3: Result

    Merged intervals become [[1,10],[11,15]] because [2,5] and [6,9] are inside [1,10].
  4. Final Answer:

    Sort intervals by start time and merge by extending the end to max of overlapping intervals -> Option A
  5. Quick Check:

    Sort + max end merge = correct nested handling [OK]
Hint: Always extend merged end to max overlapping end [OK]
Common Mistakes:
  • Sorting by end time instead of start time
  • Removing nested intervals instead of merging
  • Merging only exact matches, missing nested cases
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