合并两个有序数组(三指针法)

 

这道题使用三指针法,实际上是创建三个变量模拟下标的走势:

一般常规想法是先合并再排序,三指针则是边合并边排序;

l1是nums1的有效数据的最后一位的下标,即m - 1;

l2是num2的有效数据的最后一位的下标,即n - 1;

l是两个合并后有效数据的最后一位的下标,即m + n - 1;

要从nums1后面开始合并,从前面开始合并可能会覆盖掉数据,将l1和l2当前下标的值进行比较,大的排到l指向的位置,并且相应下标和l两个都要减一,直到nums2的元素全部合并到nums1为止。

为什么可以这么做?因为l1,l2,l都只在相应位置停留一次,所以不会出现数据重复或者缺少的情况。

这里可能会有两个情况:

1.l2先小于0,则已经将nums2的元素合并完了;

2.l1先小于0,则nums2的元素还没有合并完,且剩下的nums2元素均小于后面需要排入nums1位置的值,所以直接将nums2有序排入即可。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int l = m + n - 1;
    int l1 = m - 1;
    int l2 = n - 1;
    while(l2 >= 0 && l1 >= 0)
    {
        if(nums2[l2] > nums1[l1])
        {
            nums1[l--] = nums2[l2--];
        }
        else
        {
            nums1[l--] = nums1[l1--];
        }
    }
    while(l2 >= 0)
    {
        nums1[l--] = nums2[l2--];
    }

}

相关推荐

  1. 算法:合并有序数组

    2024-01-22 03:02:02       67 阅读
  2. 【排序算法】合并有序数组

    2024-01-22 03:02:02       58 阅读
  3. LeetCode 88. 合并有序数组

    2024-01-22 03:02:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 03:02:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 03:02:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 03:02:02       87 阅读
  4. Python语言-面向对象

    2024-01-22 03:02:02       96 阅读

热门阅读

  1. Ubuntu防火墙管理

    2024-01-22 03:02:02       54 阅读
  2. GraphQL语法用于模式验证和代码生成的新方法

    2024-01-22 03:02:02       57 阅读
  3. 独孤思维:做副业,家人不理解怎么办?

    2024-01-22 03:02:02       51 阅读
  4. 开发安全之:System Information Leak: External

    2024-01-22 03:02:02       52 阅读
  5. 2024作息打卡和事件梳理

    2024-01-22 03:02:02       52 阅读
  6. iView 中DatePicker日期选择器 v-model不生效的情况

    2024-01-22 03:02:02       44 阅读
  7. 【鸿蒙4.0】harmonyos Day 04

    2024-01-22 03:02:02       54 阅读