Skip to content

57. Insert Interval

from typing import List


class Solution:
    """Insert a new interval into a sorted list of non-overlapping intervals and merge if needed.

    Problem Statement:
        Given a sorted list of non-overlapping intervals and a newInterval, insert it and merge
        any overlapping intervals, returning the updated sorted list.

    Approach:
        1. Add all intervals that end before newInterval starts.
        2. Merge all intervals that overlap with newInterval by expanding its bounds.
        3. Add the merged interval, then add all remaining intervals.

    Complexity:
        Time: O(n) — single pass through the intervals.
        Space: O(n) for the result list.
    """

    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        results = []
        n = len(intervals)
        i = 0

        while i < n and intervals[i][1] < newInterval[0]:
            results.append(intervals[i])
            i += 1

        while i < n and intervals[i][0] <= newInterval[1]:
            newInterval = [
                min(newInterval[0], intervals[i][0]),
                max(newInterval[1], intervals[i][1]),
            ]
            i += 1
        results.append(newInterval)

        while i < n:
            results.append(intervals[i])
            i += 1

        return results