Merge Intervals

Given an array of intervals, merge all overlapping intervals and return an array of non-overlapping intervals covering all input intervals.

Example 1
Input: [[1,3],[2,6],[8,10],[15,18]] → Output: [[1,6],[8,10],[15,18]]
Example 2
Input: [[1,4],[4,5]] → Output: [[1,5]]

Solution Approach

Sort by start time. Iterate: if current interval overlaps with last merged interval, expand it. Otherwise, add to result.

  • Sort intervals by start.
  • Initialize result with first interval.
  • For each subsequent interval: if its start <= last.end, expand last.end = max(last.end, curr.end).
  • Else add current interval to result.
Java
import java.util.*;

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a,b) -> a[0] - b[0]);
        List<int[]> res = new ArrayList<>();
        res.add(intervals[0]);
        for (int[] curr : intervals) {
            int[] last = res.get(res.size() - 1);
            if (curr[0] <= last[1]) last[1] = Math.max(last[1], curr[1]);
            else res.add(curr);
        }
        return res.toArray(new int[0][]);
    }
}
  • Time Complexity: O(N log N)
  • Space Complexity: O(N)