---
title: '57. Insert Interval'
description: You are given an array of non-overlapping intervals intervals where intervals[i] = [starti, endi] represent the start and the end of the i^th interval and intervals is sorted in ascending order by starti. You are also given an interval newInterval = [start, end] that represents the start and end of another interval
icon: dot
topics:
  - { name: "Array", slug: "array" }
sidebar:
  label: 'Insert Interval'
  badge: 'Medium'
---

### Example 1:
- Input: `intervals = [[1,3],[6,9]], newInterval = [2,5]`
- Output: `[[1,5],[6,9]]`

### Example 2:
- Input: `intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]`
- Output: `[[1,2],[3,10],[12,16]]`
- Explanation: Because the new interval `[4,8]` overlaps with [3,5],[6,7],[8,10].

### Constraints:

- `0 <= intervals.length <= 10^4`
- `intervals[i].length == 2`
- `0 <= starti <= endi <= 10^5`
- intervals is sorted by starti in ascending order.
- `newInterval.length == 2`
- `0 <= start <= end <= 10^5`

## Solution

```py
class Solution:
    def insert(
        self, intervals: list[list[int]], newInterval: list[int]
    ) -> list[list[int]]:
        result = []
        i, n = 0, len(intervals)
        start, end = newInterval

        # Everything before
        while i < n and intervals[i][1] < start:
            result.append(intervals[i])
            i += 1

        # Everything merged
        while i < n and intervals[i][0] <= end:
            start = min(start, intervals[i][0])
            end = max(end, intervals[i][1])
            i += 1
        result.append([start, end])

        # Everything after
        result.extend(intervals[i:])
        return result
```
