Sort intervals by start and combine overlapping ones in a single pass.
After sorting by start time, push the first interval; for each next interval, either merge into the last or append if disjoint.
Use when consolidating overlaps in schedules, ranges, or timelines.
Sort by start, then greedily merge when current.start ≤ last.end; update end with max end.
Use this pattern when use when consolidating overlaps in schedules, ranges, or timelines.
def merge_intervals(intervals):
intervals.sort(key=lambda x: x[0])
merged = []
for s, e in intervals:
if not merged or s > merged[-1][1]:
merged.append([s, e])
else:
merged[-1][1] = max(merged[-1][1], e)
return mergedClassic approach sorting by start and merging greedily.
def merge_intervals(intervals):
intervals.sort(key=lambda x: x[0])
merged = []
for s, e in intervals:
if not merged or s > merged[-1][1]:
merged.append([s, e])
else:
merged[-1][1] = max(merged[-1][1], e)
return mergedCompare endpoint sweeping for overlap counts vs greedy merge for consolidation
def max_overlap(intervals):
events = []
for s, e in intervals:
events.append((s, 1))
events.append((e, -1)) # treat end as leaving at time e
events.sort(key=lambda x: (x[0], x[1]))
cur = ans = 0
for _, d in events:
cur += d
ans = max(ans, cur)
return ansSorting dominates; merging is linear.
Output list of merged intervals.