Given an array of intervals, merge all overlapping intervals and return an array of non-overlapping intervals covering all input intervals.
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.
- Time Complexity: O(N log N)
- Space Complexity: O(N)