Given a list of intervals, each represented as a pair of integers [start, end], merge all overlapping intervals and return a new list of non-overlapping intervals. Each interval is inclusive of its start and end times.
Example 1:
Input: intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
Output: [[1, 6], [8, 10], [15, 18]]
Example 2:
Input: intervals = [[1, 4], [4, 5]]
Output: [[1, 5]]
0 <= intervals.length <= 10^4-10^4 <= start <= end <= 10^4