Bootstrap

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

题目如下:

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

从后往前比较大小,大的放后面。建立三指针变量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)

;