Optimal: three phases
Time O(n) Space O(n)Copy intervals with end < new.start. Merge every interval with start ≤ new.end into the new one (min start, max end), then add it. Copy the rest.
import java.util.*;
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> out = new ArrayList<>();
int i = 0, n = intervals.length;
int start = newInterval[0], end = newInterval[1];
while (i < n && intervals[i][1] < start) out.add(intervals[i++]);
while (i < n && intervals[i][0] <= end) {
start = Math.min(start, intervals[i][0]);
end = Math.max(end, intervals[i][1]);
i++;
}
out.add(new int[]{start, end});
while (i < n) out.add(intervals[i++]);
return out.toArray(new int[0][]);
}
}Verdict: One pass.