算法攻略:顺序表的进阶之路——合并两个有序数组

题目如下:

在这里插入图片描述
解题思路:

从后往前比较大小,大的放后面。建立三指针变量l1(list1)、l2、l3,其中l1、l2分别指向两个数组中的最后一位有效数据,l3指向数组nums1中的最后一个位置,用来存放比较结果中较大的数据。

  1. nums[l1] < nums[l2],nums[l3 - -] = nums[l2 - -]
  2. nums[l1] >= nums[l2],nums[l3 - -] = nums[l1 - -]

对示例1画出每一步的变化图:

在这里插入图片描述

不难看出:

  1. 只要l1或l2越界(只要有一个为假),那么就会终止比较大小,也就是会终止循环。那么就可以写出进入循环的条件,while (l1 >= 0 && l2 >= 0)
  2. l3初始值是m+n-1

完整代码如下:

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

时间复杂度:O(n + n) -->O(2n)–>O(n),空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值