Insert an Interval Into Sorted Intervals

medium intervals array

Problem

Given a list of non-overlapping intervals sorted by start and a new interval newInt, return the merged list. Walk the original list in three regions: copy intervals that end strictly before newInt starts, then absorb every interval that overlaps newInt by widening newInt in place, then append the merged interval and copy the remainder.

Inputintervals = [[1,3],[6,9]], newInt = [2,5]
Output[[1,5],[6,9]]
[2,5] swallows [1,3] → [1,5]; [6,9] is unaffected.

def insert(intervals, new_int):
    out = []
    i, n = 0, len(intervals)
    while i < n and intervals[i][1] < new_int[0]:
        out.append(intervals[i]); i += 1
    while i < n and intervals[i][0] <= new_int[1]:
        new_int = [min(new_int[0], intervals[i][0]), max(new_int[1], intervals[i][1])]
        i += 1
    out.append(new_int)
    while i < n:
        out.append(intervals[i]); i += 1
    return out
function insert(intervals, newInt) {
  const out = [];
  let i = 0, n = intervals.length;
  while (i < n && intervals[i][1] < newInt[0]) out.push(intervals[i++]);
  while (i < n && intervals[i][0] <= newInt[1]) {
    newInt = [Math.min(newInt[0], intervals[i][0]), Math.max(newInt[1], intervals[i][1])];
    i++;
  }
  out.push(newInt);
  while (i < n) out.push(intervals[i++]);
  return out;
}
class Solution {
    public int[][] insert(int[][] intervals, int[] newInt) {
        List<int[]> out = new ArrayList<>();
        int i = 0, n = intervals.length;
        while (i < n && intervals[i][1] < newInt[0]) out.add(intervals[i++]);
        while (i < n && intervals[i][0] <= newInt[1]) {
            newInt = new int[]{Math.min(newInt[0], intervals[i][0]), Math.max(newInt[1], intervals[i][1])};
            i++;
        }
        out.add(newInt);
        while (i < n) out.add(intervals[i++]);
        return out.toArray(new int[0][]);
    }
}
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int> newInt) {
    vector<vector<int>> out;
    int i = 0, n = intervals.size();
    while (i < n && intervals[i][1] < newInt[0]) out.push_back(intervals[i++]);
    while (i < n && intervals[i][0] <= newInt[1]) {
        newInt = {min(newInt[0], intervals[i][0]), max(newInt[1], intervals[i][1])};
        ++i;
    }
    out.push_back(newInt);
    while (i < n) out.push_back(intervals[i++]);
    return out;
}
Time: O(n) Space: O(n)