双指针法可在线性时间合并有序数组:标准双指针用额外空间o(m+n),逻辑清晰稳定;逆向双指针原地合并,空间o(1),适用于nums1尾部有空位场景;归并段式合并用于同一数组内相邻有序子段,是归并排序核心。

标准双指针(额外空间,逻辑最清晰)
适合初学或对代码可读性要求高的场景。创建一个新数组,两个指针分别从头开始遍历,谁小就取谁,填入结果数组;某一方走完后,把另一方剩余元素一次性拷贝过去。关键点:
- 时间复杂度固定为 O(m + n),充分利用了“已有序”这一前提
- 空间复杂度 O(m + n),但避免了覆盖风险,不易出错
- 稳定:相等元素的相对顺序不会改变
- 代码结构对称,容易理解和调试
逆向双指针(原地合并,空间 O(1))
当题目明确给出 nums1 有足够尾部空间(如 LeetCode 88 题),就该用这个方法。从两个数组有效部分末尾开始比较,把较大值依次填入 nums1 的最末位置。优势在于:
- 完全不用额外数组,空间开销为常数
- 避免前向填充时覆盖未处理的 nums1 元素
- 只需一次遍历,且剩余部分只需处理 nums2(因为 nums1 剩余天然有序)
归并段式合并(用于分治或外部排序)
这不是合并两个独立数组,而是合并同一数组中两个相邻有序子段(如 arr[low..mid] 和 arr[mid+1..high])。这是归并排序的核心操作,也适用于大文件分块排序后的磁盘归并。典型使用方式:
- 输入是单个数组 + 三个下标(low, mid, high)
- 内部仍用双指针,但数据源都在原数组内
- 通常配合临时数组暂存结果,再整体拷回,保证稳定性
- 可轻松扩展为多路归并,支撑 TB 级数据排序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











