大家好,这篇简单记录一下 LeetCode 56. 合并区间 的 JavaScript 解法,思路清晰、代码短、面试常考,直接收藏就能用。
题目描述
给定一个区间数组,请你合并所有重叠的区间,返回一个不重叠的区间数组。
示例:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
核心思路
- 先按区间左端点从小到大排序(必须做,否则无法顺序合并)
- 用结果数组保存已合并区间
- 遍历每个区间:
- 重叠 → 合并(更新右边界)
- 不重叠 → 直接加入结果
一句话总结:排序 + 遍历比较 + 重叠合并。
JS 完整代码(可直接复制提交)
var merge = function(intervals) {
// 按区间左端点排序
intervals.sort((a, b) => a[0] - b[0]);
let res = [];
// 先把第一个区间放进去
res.push(intervals[0]);
// 遍历剩下所有区间
for(let i = 1; i < intervals.length; i++) {
// 拿到结果里最后一个区间
let last = res[res.length - 1];
// 当前遍历到的区间
let cur = intervals[i];
// 有重叠:合并区间
if(cur[0] <= last[1]) {
// 右边界取最大
last[1] = Math.max(last[1], cur[1]);
} else {
// 不重叠:直接加入结果
res.push(cur);
}
}
return res;
};
代码逐行解释
1. 排序
intervals.sort((a, b) => a[0] - b[0]);
把所有区间按起点从小到大排好,才能从左到右依次合并。
2. 初始化结果数组
let res = [];
res.push(intervals[0]);
先把第一个区间放进去,作为基准区间。
3. 遍历 + 合并
let last = res[res.length - 1]; // 已合并的最后一个区间
let cur = intervals[i]; // 当前要判断的区间
- 重叠判断:
cur[0] <= last[1]当前区间起点 ≤ 最后一个区间终点 = 重叠 - 合并:
last[1] = Math.max(last[1], cur[1])终点取两个区间里更大的那个 - 不重叠:直接
push进结果
小提醒
- 必须先排序,否则合并逻辑会出错
- 只需要维护结果数组最后一个区间即可,不用回头看前面
- 时间复杂度:O(n log n)(排序耗时)
- 空间复杂度:O(1)(原地修改)
总结
这道题是区间类最经典基础题,思路固定: 排序 → 遍历 → 比较最后一个区间 → 重叠合并
代码简洁好记,面试手写无压力。
需要我再给你加一个动图演示合并过程吗?我可以直接给你配上,文章会更容易看懂~