归并排序的 merge 操作可直接用于合并两个已排序数组:用双指针逐个比较取小值,时间复杂度 O(m+n),空间复杂度 O(m+n) 或 O(1)(原地合并);常见实现包括新建数组和从后往前原地合并。

Java 中归并排序本身是用于对无序数组排序的分治算法,但它的“合并”步骤——即把两个已有序的子数组合并成一个有序数组——可以直接复用,来高效合并两个已排序的数组。这不是归并排序的完整流程,而是其中核心的 merge 操作。
理解 merge 操作的本质
合并两个升序数组(比如 [1, 3, 5] 和 [2, 4, 6, 7])的关键在于:不用额外排序,只靠双指针逐个比较、取小值放入结果中。时间复杂度 O(m + n),空间复杂度 O(m + n)(若需新数组)或 O(1)(若允许原地覆盖且目标数组有足够空间)。
基础实现:返回新数组
这是最清晰、安全的方式,适合大多数场景:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 定义两个指针 i 和 j,分别指向两数组开头
- 创建长度为 arr1.length + arr2.length 的结果数组
- 循环比较 arr1[i] 和 arr2[j],把较小值放入结果,并移动对应指针
- 某一方指针越界后,把另一方剩余元素全部复制过去
原地合并(当 arr1 有足够空位时)
常见于类似 LeetCode 88 题(合并两个有序数组,nums1 末尾有足够 0 填充):从后往前双指针,避免覆盖未处理元素。
立即学习“Java免费学习笔记(深入)”;
- 设指针 i = m - 1(nums1 有效末尾),j = n - 1(nums2 末尾),k = m + n - 1(nums1 总末尾)
- 比较 nums1[i] 和 nums2[j],较大者填入 nums1[k],对应指针和 k 同时前移
- 若 j ≥ 0 但 i < 0,说明 nums2 还剩元素,直接复制到 nums1 前段
- i ≥ 0 但 j < 0 时无需操作(nums1 剩余部分已在正确位置)
使用 Java 标准库辅助(不推荐用于学习,但可参考)
Java 没有内置的“合并两个有序数组”工具方法,但你可以:
- 用 Stream.concat() 拼接再 sorted() —— 会失去 O(m+n) 优势,变成 O((m+n) log(m+n))
- 手写 merge 更轻量、更可控,也更体现算法思想
- 若项目中频繁使用,可封装为静态工具方法,支持泛型和自定义比较器

















