Given an array of `intervals` where `intervals[i] = [starti, endi]`, merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input. **Example 1:** Input: `intervals = [[1,3],[2,6],[8,10],[15,18]]` Output: `[[1,6],[8,10],[15,18]]` Explanation: Since intervals `[1,3]` and `[2,6]` overlap, merge them into `[1,6]`. **Example 2:** Input: `intervals = [[1,4],[4,5]]` Output: `[[1,5]]` Explanation: Intervals `[1,4]` and `[4,5]` are considered overlapping.
Sorting + Greedy Merge
If we sort the intervals by their start times, any overlapping intervals must be adjacent in the sorted list. We can then iterate through the sorted intervals and either merge the current interval with the last interval in our result (if they overlap) or add it as a new interval.