直接回答:把所有区间按起点升序排序,然后线性扫描:维护结果列表,当前区间若与结果末尾区间有重叠(起点 ≤ 末尾区间的终点),就合并(终点取两者较大者);否则作为新的独立区间追加。时间 O(n log n)(瓶颈在排序),空间 O(n)。

展开解析:排序是让「可能重叠的区间彼此相邻」的关键预处理,排序后合并只需一次扫描,贪心性质显然。两个实现细节:重叠判定是 cur.start <= merged.end(闭区间下等号也算重叠);合并时终点要取 max 而非直接替换,因为先开始的区间可能完全包住后开始的。同族题型是面试高频组合:插入区间(在有序不重叠列表中插入并合并,可用二分定位)、区间交集(双指针)、会议室 II(最少会议室数,用开始/结束事件扫描线或最小堆)、删除被覆盖区间。追问方向:为什么排序后贪心正确(交换论证)、扫描线思想在区间族问题中的统一视角。

示例

def merge(intervals):
    intervals.sort(key=lambda x: x[0])
    merged = []
    for start, end in intervals:
        if merged and start <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], end)
        else:
            merged.append([start, end])
    return merged