推荐双指针法合并两个有序数组,时间复杂度o(m+n),空间复杂度o(m+n);原地合并需从后往前避免覆盖;不推荐使用排序或stream,因破坏有序性且性能差。

直接用双指针法,从头开始逐个比较两个数组的元素,把小的先放进新数组,时间复杂度 O(m+n),空间复杂度 O(m+n)。
双指针合并(推荐)
这是最常用、最直观的方法。维护两个指针分别指向两个数组的开头,每次取较小值放入结果数组,对应指针后移。
- 初始化 i = 0, j = 0,结果数组 res 长度为两数组长度之和
- 循环直到任一数组遍历完:比较 nums1[i] 和 nums2[j],较小者入 res,对应索引加 1
- 把剩余未处理的元素(来自任一数组)全部追加到 res 后面
使用 ArrayList + Collections.sort(不推荐)
把两个数组元素全加进 ArrayList,再调 sort。虽然代码短,但破坏了原有序性,时间复杂度升至 O((m+n) log(m+n)),纯属浪费。
- 仅适合极小数据量或原型验证,生产环境避免
- 如果必须用动态结构,建议仍走双指针逻辑,手动 add 而非依赖排序
原地合并(当第一个数组有足够空间时)
类似 LeetCode 88 题场景:nums1 有 m 个有效元素,后面预留了 n 个空位,nums2 有 n 个元素。此时应从后往前合并,避免覆盖。
- 设三个指针:i = m-1(nums1 末尾有效位),j = n-1(nums2 末尾),k = m+n-1(nums1 真实末尾)
- 比较 nums1[i] 和 nums2[j],较大者放 nums1[k],对应指针前移
- 若 nums2 还剩元素,继续拷贝;nums1 剩余部分已在原位,无需操作
借助 Java 8 Stream(简洁但注意性能)
适合函数式风格或一次性小任务,底层仍是复制+排序,不适用于大数组或性能敏感场景。
- 写法示例:int[] res = Stream.concat(Arrays.stream(a), Arrays.stream(b))
- .sorted().mapToInt(Integer::intValue).toArray();
- 本质是创建新流、合并、排序,没利用已排序特性,慎用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











