1. Problem Summary
You are given:
- a list of non-overlapping intervals
- the intervals are sorted by start time
- a new interval that must be inserted into the list
Your task is to:
- Insert the new interval into the list
- Merge any overlapping intervals that result
- Return the final list of intervals
Example interpretation:
If the existing intervals are [[1,3], [6,9]] and the new interval is [2,5], after inserting and merging, the output becomes [[1,5], [6,9]].
2. Key Insights
The original intervals are already:
- non-overlapping
- sorted by starting time
This allows a linear scan.
Three logical phases occur:
- Intervals that end before the new interval starts
- Intervals that overlap with the new interval
- Intervals that start after the merged interval ends
Overlapping rule
Two intervals overlap if:
current.start <= new.end AND current.end >= new.start
Merging rule
While overlapping:
new.start = min(new.start, current.start) new.end = max(new.end, current.end)
3. Approach
Linear traversal with merging
Steps:
- Create an output list.
- Traverse intervals while:
- interval ends before new interval starts → add to output.
- Continue traversal while intervals overlap:
- merge them into the new interval.
- Add the merged new interval.
- Append remaining intervals.
This ensures ordering and correctness.
4. Time and Space Complexity
Time Complexity: O(N)
You pass through the interval list once.
Space Complexity: O(N)
Output list stores merged intervals.
5. Java Solution
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> result = new ArrayList<>();
int i = 0;
int n = intervals.length;
// Step 1: Add all intervals ending before newInterval begins
while (i < n && intervals[i][1] < newInterval[0]) {
result.add(intervals[i]);
i++;
}
// Step 2: Merge all overlapping intervals
while (i < n && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
// Add merged interval
result.add(newInterval);
// Step 3: Add remaining intervals
while (i < n) {
result.add(intervals[i]);
i++;
}
return result.toArray(new int[result.size()][]);
}
}
6. Dry Run Example
Input:
intervals = [[1,3], [6,9]] newInterval = [2,5]
Step-by-step:
- Compare
[1,3]with[2,5]
Overlap exists
Merge → newInterval becomes[1,5] - Compare
[6,9]with[1,5]
No overlap since 6 > 5
Stop merging - Add merged
[1,5]to output - Append
[6,9]
Final Output:
[[1,5], [6,9]]
Another Dry Run (more merging)
Input:
intervals = [[1,2], [3,5], [6,7], [8,10], [12,16]] newInterval = [4,8]
Processing:
- Skip
[1,2](ends before 4) [3,5]overlaps → merge to[3,8][6,7]overlaps → merge to[3,8][8,10]overlaps → merge to[3,10]- Stop at
[12,16]
Output:
[[1,2], [3,10], [12,16]]
