Bird
Raised Fist0
DSA Pythonprogramming

Merge Overlapping Intervals in DSA Python

Choose your learning style10 modes available
Mental Model
We combine intervals that touch or overlap into one bigger interval so there are no overlaps left.
Analogy: Imagine you have several time blocks booked on a calendar. If some blocks overlap or touch, you merge them into one longer block to avoid confusion.
Intervals before merge:
[1,3]  [2,6]  [8,10]  [15,18]

Intervals after merge:
[1,6]  [8,10]  [15,18]
Dry Run Walkthrough
Input: intervals: [[1,3], [2,6], [8,10], [15,18]]
Goal: Merge all overlapping intervals into combined intervals without overlaps
Step 1: Sort intervals by start time
[1,3] -> [2,6] -> [8,10] -> [15,18]
Why: Sorting helps us check intervals in order to find overlaps easily
Step 2: Start with first interval [1,3] in merged list
merged: [1,3]
Why: We need a base interval to compare others against
Step 3: Compare next interval [2,6] with last merged [1,3]; they overlap
merged: [1,6]
Why: Since 2 ≤ 3, intervals overlap; merge by extending end to max(3,6)=6
Step 4: Compare next interval [8,10] with last merged [1,6]; no overlap
merged: [1,6] -> [8,10]
Why: 8 > 6 means no overlap; add new interval to merged list
Step 5: Compare next interval [15,18] with last merged [8,10]; no overlap
merged: [1,6] -> [8,10] -> [15,18]
Why: 15 > 10 means no overlap; add new interval
Result:
merged intervals: [1,6] -> [8,10] -> [15,18]
Annotated Code
DSA Python
from typing import List

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # Sort intervals by start time
        intervals.sort(key=lambda x: x[0])
        merged = []
        for interval in intervals:
            # If merged is empty or no overlap, add interval
            if not merged or merged[-1][1] < interval[0]:
                merged.append(interval)
            else:
                # Overlap: merge by updating the end of last interval
                merged[-1][1] = max(merged[-1][1], interval[1])
        return merged

# Driver code
intervals = [[1,3], [2,6], [8,10], [15,18]]
sol = Solution()
result = sol.merge(intervals)
for interval in result:
    print(f"[{interval[0]},{interval[1]}]", end=" ")
intervals.sort(key=lambda x: x[0])
Sort intervals by their start time to process in order
if not merged or merged[-1][1] < interval[0]:
Check if current interval does not overlap with last merged
merged.append(interval)
Add non-overlapping interval to merged list
merged[-1][1] = max(merged[-1][1], interval[1])
Merge overlapping intervals by extending the end time
OutputSuccess
[1,6] [8,10] [15,18]
Complexity Analysis
Time: O(n log n) because sorting the intervals takes O(n log n) and merging takes O(n)
Space: O(n) because in worst case no intervals overlap and merged list stores all intervals
vs Alternative: Naive approach checking every pair for overlap is O(n^2), so sorting + one pass merge is more efficient
Edge Cases
empty intervals list
returns empty list without error
DSA Python
if not merged or merged[-1][1] < interval[0]:
all intervals non-overlapping
returns original intervals sorted
DSA Python
if not merged or merged[-1][1] < interval[0]:
all intervals overlapping into one big interval
returns single merged interval covering all
DSA Python
merged[-1][1] = max(merged[-1][1], interval[1])
When to Use This Pattern
When you see a problem asking to combine or simplify overlapping ranges, reach for the merge intervals pattern because sorting and merging in one pass solves it efficiently.
Common Mistakes
Mistake: Not sorting intervals before merging
Fix: Always sort intervals by start time first to ensure correct merging order
Mistake: Modifying original intervals without copying
Fix: Be careful if input should not be changed; otherwise, modifying in place is fine
Summary
Merges overlapping intervals into combined intervals without overlaps.
Use when you need to simplify or combine overlapping ranges efficiently.
Sort intervals first, then merge by comparing current interval with last merged.

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