Merge Intervals
Problem Statement
Given a list of intervals [start, end], merge overlapping intervals into a minimal set of non-overlapping ones. This medium-level greedy problem is like tidying up a timeline—combine overlapping events into single blocks!
Example
Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Input: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Code
Java
Python
JavaScript
public class Solution { public int[][] merge(int[][] intervals) { Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0])); Listresult = new ArrayList<>(); result.add(intervals[0]); for (int i = 1; i < intervals.length; i++) { int[] curr = result.get(result.size() - 1); if (curr[1] >= intervals[i][0]) { curr[1] = Math.max(curr[1], intervals[i][1]); } else { result.add(intervals[i]); } } return result.toArray(new int[result.size()][]); } }
def merge(intervals): intervals.sort(key=lambda x: x[0]) result = [intervals[0]] for i in range(1, len(intervals)): curr = result[-1] if curr[1] >= intervals[i][0]: curr[1] = max(curr[1], intervals[i][1]) else: result.append(intervals[i]) return result
function merge(intervals) { intervals.sort((a, b) => a[0] - b[0]); const result = [intervals[0]]; for (let i = 1; i < intervals.length; i++) { const curr = result[result.length - 1]; if (curr[1] >= intervals[i][0]) { curr[1] = Math.max(curr[1], intervals[i][1]); } else { result.push(intervals[i]); } } return result; }
Explanation
- Greedy Choice: Sort by start time, merge with the last interval if overlapping.
- Flow: Extend end time if overlap occurs; otherwise, add new interval.
- Example: [[1,3],[2,6]] → [1,6], then [8,10],[15,18] stay separate.
Note
Time complexity: O(n log n), Space complexity: O(n) for the result. Merge with ease!