最常用且高效的方法是双指针归并法,时间复杂度O(m+n),空间复杂度O(m+n);维护两指针从头遍历,每次取较小元素加入结果数组并移动对应指针。

Java 中合并两个有序数组为一个新的有序数组,最常用且高效的方法是**双指针归并法**,时间复杂度 O(m + n),空间复杂度 O(m + n)(用于存放结果)。不需要额外排序,充分利用原数组已有序的特性。
使用双指针从头开始归并
这是标准归并排序中“合并”步骤的直接应用。维护两个指针分别指向两个数组的起始位置,每次取较小元素加入结果数组,并移动对应指针。
示例代码:
public static int[] mergeSortedArrays(int[] a, int[] b) {
int m = a.length, n = b.length;
int[] result = new int[m + n];
int i = 0, j = 0, k = 0;
// 归并主循环:两个数组都未遍历完时
while (i < m && j < n) {
if (a[i] <= b[j]) {
result[k++] = a[i++];
} else {
result[k++] = b[j++];
}
}
// 复制剩余元素(只会执行其中一个)
while (i < m) result[k++] = a[i++];
while (j < n) result[k++] = b[j++];
return result;
}
处理 null 或空数组的健壮版本
实际使用中需考虑边界情况,比如某个数组为 null、长度为 0,或元素类型为 Integer(可能含 null)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 先校验输入:对 null 数组可抛出 IllegalArgumentException,或按约定视为空数组
- 若允许 null 元素(如 Integer[]),比较前需判空,避免 NullPointerException
- 对于泛型数组(T[]),需传入 Comparator 或要求 T 实现 Comparable
原地合并(当第一个数组有足够空间时)
如果题目条件类似 LeetCode 88:nums1 有足够空间容纳 nums1 和 nums2 的所有元素(例如 nums1.length == m + n),则可**从后往前双指针归并**,避免覆盖未处理元素。
- 用三个指针:i 指向 nums1 有效末尾,j 指向 nums2 末尾,k 指向 nums1 总长度末尾
- 每次选较大值填入 nums1[k],然后 k 和对应指针前移
- 最后若 nums2 还有剩余,直接复制过去(nums1 剩余部分已在原位,无需操作)
借助 Java 集合类的简洁写法(适合小数据或快速验证)
不推荐用于性能敏感场景,但代码简短易读:
- 将两个数组转为 List,addAll 后用 Collections.sort() —— 会破坏 O(m+n) 时间优势
- 更合理的方式:用 Stream 流式合并(仍需归并逻辑,否则无法保序)
- 正确流式归并需自定义迭代器或分步 flatMap,实际不如手写双指针清晰

















