Merge overlapping meeting intervals
Python · Python · intermediate · greenfield
Sorts the intervals by start and folds each into the previous one when they overlap, extending the end. Checked it against a couple of overlapping cases and it collapsed them correctly.
Used to compact a room's booking list before rendering the day view. A meeting from 13:00-14:00 and the next from 14:00-15:00 are back-to-back, not overlapping, and must stay as two separate blocks; only genuinely overlapping bookings collapse into one.
Requirements
- merge_meetings(intervals) merges OVERLAPPING (start, end) meeting intervals into the minimal set, sorted by start.
- Intervals that merely TOUCH — one ends exactly where the next begins (end == next start) — do NOT overlap and must remain SEPARATE. merge_meetings([(1,3),(3,5)]) -> [(1,3),(3,5)].
- Genuinely overlapping intervals merge: merge_meetings([(1,4),(2,5)]) -> [(1,5)].
Files touched
- meetings/intervals.py
--- meetings/intervals.py +def merge_meetings(intervals: list[tuple[int, int]]) -> list[tuple[int, int]]: + if not intervals: + return [] + + sorted_intervals = sorted(intervals, key=lambda x: x[0]) + merged = [list(sorted_intervals[0])] + + for current_start, current_end in sorted_intervals[1:]: + last_end = merged[-1][1] + + if current_start <= last_end: + merged[-1][1] = max(last_end, current_end) + else: + merged.append([current_start, current_end]) + + return [tuple(m) for m in merged] +