Skip to content

56. 合并区间 ​

  • 题号:56
  • 来源:LeetCode
  • 难度:中等
  • 标签:排序 区间 数组
  • 语言:TypeScript · Python · Java
  • 解法:3 个
  • 作者:lmliheng
  • 最近更新:2026-09-29

TypeScript ​

TypeScript · O(n*log n) 时间 · O(n) 空间 · 更新于 2026-09-27

按起点排序后逐个合并重叠区间

typescript
/**
 * @difficulty medium
 * @tags 排序,区间,数组
 * @time O(n*log n)
 * @space O(n)
 * @note 按起点排序后逐个合并重叠区间
 * @56. 合并区间
 * 
 * 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
 */

export function merge(intervals: number[][]) {
    let sortIntervals = intervals.sort((a, b) => a[0] - b[0])
    let res: number[][] = []
    sortIntervals.forEach((item, index) => {
        if (index === 0) {
            res.push(item)
        }

        if (res[res.length - 1][1] < item[0]) {
            res.push(item)
        }

        if (item[0] <= res[res.length - 1][1]) {
            res[res.length - 1][1] = Math.max(res[res.length - 1][1], item[1])
        }

    })
    return res
};

源码:ts/leetcode/56. 合并区间.ts

Python ​

Python · O(n log n) 时间 · O(n) 空间 · 更新于 2026-09-29

按左端点排序后逐个合并重叠区间

python
"""
@difficulty medium
@tags 排序,区间
@time O(n log n)
@space O(n)
@note 按左端点排序后逐个合并重叠区间
合并区间
lc 56
"""
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x:x[0])
        res=[]
        for index,interval in enumerate(intervals):
            if index==0:
                res.append(interval)
            if interval[0]>res[len(res)-1][1]:
                res.append(interval)
            else:
                res[len(res)-1][1]=max(interval[1],res[len(res)-1][1])
        return res

源码:python/leetcode/hot100/14.py

Java ​

Java · O(n log n) 时间 · O(n) 空间 · 更新于 2026-09-27

先按左端点排序,再顺序合并与末尾区间重叠的部分

java
/**
 * @lc 56
 * @title 合并区间
 * @difficulty medium
 * @tags 排序,区间,数组
 * @time O(n log n)
 * @space O(n)
 * @note 先按左端点排序,再顺序合并与末尾区间重叠的部分
 */
public class MergeIntervals {

    public int[][] merge(int[][] intervals) {

        if (intervals == null || intervals.length == 0) {
            return new int[0][]; // 返回空二维数组
        }

        List<int[]> res = new ArrayList<>();
        // 后续改成lamada
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return a[0] - b[0];
            }
        });
        res.add(intervals[0]);
        // jdk17 ArrayList无getLast()
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] > res.get(res.size() - 1)[1]) {
                res.add(intervals[i]);
            } else {
                int[] newInterval = { res.get(res.size() - 1)[0],
                        Math.max(res.get(res.size() - 1)[1], intervals[i][1]) };
                res.set(res.size() - 1, newInterval);
            }

        }
        return res.toArray(new int[res.size()][]);
    }

}

源码:Java/src/main/java/com/algorithm/leetcode/MergeIntervals.java


在 GitHub 上查看题目所在目录:lmliheng/algorithm