合并两个有序数组(C语言)———顺序表经典算法题

目录

题目描述. - 力扣(LeetCode):

答案展示:

题目讲解:

思路简析:

过程讲解:


题目描述. - 力扣(LeetCode)

答案展示:

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

}

题目讲解:

思路简析:

题目要求在原数组上改进,最后结果在nums1中。

本题有三个思路:

  1. 将nums2数组拷贝到nums1中后,进行排序
  2. 额外开辟一个数组,用来贮存num1的内容,然后用两个指针分别从头到尾遍历nums1_copy与nums2,将更大的数字放入num1中,所以一共使用了三个指针。
  3. 本文中使用的方法,同样使用三个指针,从后往前遍历三个数组,这利用了数组是非降序数组,即元素是升序或者齐平的条件,避免了开辟第三个空间。

过程讲解:

针对第三条思路进行代码讲解,分别建立三个指针,l1指向nums1的有效部分的尾元素,l2指向nums1的尾元素,l3指向nums2的尾元素。这里就会有两种情况,第一种l1从后往前遍历,并且比l2先完成遍历,即 l1 < 0 && l2 > 0。第二种反之。而第二种情况下,l2 中仍有剩余元素未处理,所以需要对 l2 中的元素单独处理。值得注意的是,这两段的执行条件都需要包含 l1,l2 等于 0。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值