> For the complete documentation index, see [llms.txt](https://nataliekung.gitbook.io/ladder_code/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nataliekung.gitbook.io/ladder_code/meta-2025/986.-interval-list-intersections.md).

# 986. Interval List Intersections

双指针 区间

You are given two lists of closed intervals, `firstList` and `secondList`, where `firstList[i] = [start`<sub>`i`</sub>`, end`<sub>`i`</sub>`]` and `secondList[j] = [start`<sub>`j`</sub>`, end`<sub>`j`</sub>`]`. Each list of intervals is pairwise **disjoint** and in **sorted order**.

Return *the intersection of these two interval lists*.

A **closed interval** `[a, b]` (with `a <= b`) denotes the set of real numbers `x` with `a <= x <= b`.

The **intersection** of two closed intervals is a set of real numbers that are either empty or represented as a closed interval. For example, the intersection of `[1, 3]` and `[2, 4]` is `[2, 3]`.

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2019/01/30/interval1.png)

<pre><code><strong>Input: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
</strong><strong>Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
</strong></code></pre>

**Example 2:**

<pre><code><strong>Input: firstList = [[1,3],[5,9]], secondList = []
</strong><strong>Output: []
</strong></code></pre>

&#x20;

**Constraints:**

* `0 <= firstList.length, secondList.length <= 1000`
* `firstList.length + secondList.length >= 1`
* `0 <= start`<sub>`i`</sub>` ``< end`<sub>`i`</sub>` ``<= 10`<sup>`9`</sup>
* `end`<sub>`i`</sub>` ``< start`<sub>`i+1`</sub>
* `0 <= start`<sub>`j`</sub>` ``< end`<sub>`j`</sub>` ``<= 10`<sup>`9`</sup>
* `end`<sub>`j`</sub>` ``< start`<sub>`j+1`</sub>

分析

双指针指向两区间，**移动结束时间更早的指针**。

```
class Solution:
    def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]:
        i = j = 0
        res = []
        while i < len(firstList) and j < len(secondList):
            s1, e1 = firstList[i]
            s2, e2 = secondList[j]
            start = max(s1,s2)
            end = min(e1,e2)
            if start <= end:
                res.append([start, end])
            if e1 < e2:
                i += 1
            else:
                j += 1
        return res





```
