Java 合并有序数组:三指针法 + 4 步记忆口诀

55 阅读1分钟

以下是Java实现合并两个有序数组的代码,添加了便于快速记忆的注释和口诀:

代码实现(带注释)

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int p1 = m - 1;  // nums1的有效元素末尾指针
    int p2 = n - 1;  // nums2的末尾指针
    int p = m + n - 1;  // 合并后数组的末尾指针
    
    // 从后向前遍历,将较大元素放入nums1末尾
    while (p1 >= 0 && p2 >= 0) {
        if (nums1[p1] > nums2[p2]) {
            nums1[p] = nums1[p1];  // 将nums1的较大元素放入末尾
            p1--;
        } else {
            nums1[p] = nums2[p2];  // 将nums2的较大元素放入末尾
            p2--;
        }
        p--;  // 合并指针前移
    }
    
    // 处理nums2剩余元素(若有)
    // nums1剩余元素无需处理,因为它们已经在正确位置
    System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}

记忆口诀

合并有序数组有诀窍,双指针从后往前跑
p1、p2比大小,大的元素往后靠
p1先跑完别担心,nums2剩余直接拷贝

关键点记忆

  1. 三指针初始化
    • p1 指向 nums1 的有效元素末尾
    • p2 指向 nums2 的末尾
    • p 指向合并后数组的末尾
  2. 比较逻辑
    • 从后向前比较 nums1[p1]nums2[p2],将较大值放入 nums1[p]
  3. 边界处理
    • nums2 有剩余元素,直接复制到 nums1 头部
    • nums1 的剩余元素无需处理(已在正确位置)