0986. 区间列表的交集【中等】
1. 📝 题目描述
给定两个由一些 闭区间 组成的列表,firstList 和 secondList,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj]。每个区间列表都是成对 不相交 的,并且 已经排序。
返回这 两个区间列表的交集。
形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b。
两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3]。
示例 1:

txt
输入:
firstList = [[0,2],[5,10],[13,23],[24,25]],
secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]1
2
3
4
5
2
3
4
5
示例 2:
txt
输入:
firstList = [[1,3],[5,9]],
secondList = []
输出:[]1
2
3
4
5
2
3
4
5
示例 3:
txt
输入:
firstList = [],
secondList = [[4,8],[10,12]]
输出:[]1
2
3
4
5
2
3
4
5
示例 4:
txt
输入:
firstList = [[1,7]],
secondList = [[3,10]]
输出:[[3,7]]1
2
3
4
5
2
3
4
5
提示:
0 <= firstList.length, secondList.length <= 1000firstList.length + secondList.length >= 10 <= starti < endi <= 10^9endi < starti+10 <= startj < endj <= 10^9endj < startj+1
2. 🎯 s.1 - 双指针
js
/**
* @param {number[][]} firstList
* @param {number[][]} secondList
* @return {number[][]}
*/
var intervalIntersection = function (firstList, secondList) {
const result = []
let i = 0,
j = 0
while (i < firstList.length && j < secondList.length) {
const [start1, end1] = firstList[i]
const [start2, end2] = secondList[j]
// 计算交集的起点和终点
const start = Math.max(start1, start2)
const end = Math.min(end1, end2)
// 如果有交集,添加到结果中
if (start <= end) {
result.push([start, end])
}
// 移动结束点较小的指针
if (end1 < end2) {
i++
} else {
j++
}
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- 时间复杂度:
,其中 m 和 n 分别是两个区间列表的长度,每个区间最多被访问一次 - 空间复杂度:
,不计入结果数组的空间开销
算法思路:
- 双指针遍历:用两个指针 i 和 j 分别指向两个区间列表的当前区间
- 交集计算:交集的起点为两个区间起点的较大值,终点为两个区间终点的较小值
- 有效性判断:如果起点 ≤ 终点,说明有交集,将交集添加到结果中
- 指针移动:移动结束点较小的那个指针,因为该区间已经不可能与另一个列表的后续区间产生交集
- 终止条件:当任一列表遍历完成时结束