Skip to content

Merge Intervals

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

InputOutputExplanation
[[1,3],[2,6],[8,10],[15,18]][[1,6],[8,10],[15,18]][1,3] and [2,6] overlap, merge to [1,6].
[[1,4],[4,5]][[1,5]][1,4] and [4,5] overlap at the boundary.
[[1,2],[1,2]][[1,2]]Identical intervals merge to one.
  • 1 <= intervals.length <= 10^4
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 10^4
ApproachTimeSpaceBest When
Sort and MergeO(n log n)O(1)Optimal — simplest and fastest
HeapO(n log n)O(n)Alternative structure
  • Pick Sort and Merge for the optimal interview solution — it is intuitive and efficient.
  • Pick Heap if you want to practice heap-based interval handling.
Optimal
Sort and Merge
O(n log n) time · O(1) space
Heap-based
Heap
O(n log n) time · O(n) space
★ Recommended

Sort intervals by start time, then iterate through and merge overlapping intervals by updating the end time when an overlap is detected.

⏱ Time O(n log n) Sorting dominant 💾 Space O(1) Constant
merge_intervals_sort_and_merge.py
from typing import List
def merge(intervals: List[List[int]]) -> List[List[int]]:
"""Sort and merge approach: O(n log n) time, O(n) space"""
if not intervals:
return []
intervals.sort()
merged = [intervals[0]]
for start, end in intervals[1:]:
if start <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], end)
else:
merged.append([start, end])
return merged
print(merge([[1, 3], [2, 6], [8, 10], [15, 18]]))
🎯 Interview Favourite

Use a min-heap to extract intervals in order by start time and merge them dynamically.

⏱ Time O(n log n) Heap operations 💾 Space O(n) Heap storage
merge_intervals_heap.py
from typing import List
import heapq
def merge(intervals: List[List[int]]) -> List[List[int]]:
"""Heap approach: O(n log n) time, O(n) space"""
if not intervals:
return []
heap = []
for start, end in intervals:
heapq.heappush(heap, (start, end))
merged = []
while heap:
start, end = heapq.heappop(heap)
if merged and start <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], end)
else:
merged.append([start, end])
return merged
print(merge([[1, 3], [2, 6], [8, 10]]))