88. Merge Sorted Array*

​https://leetcode.com/problems/merge-sorted-array/​

题目描述

Given two sorted integer arrays ​​nums1​​​ and ​​nums2​​​, merge ​​nums2​​​ into ​​nums1​​ as one sorted array.

Note:

  • The number of elements initialized in​​nums1​​​ and​​nums2​​​ are​​m​​​ and​​n​​ respectively.
  • You may assume that​​nums1​​​ has enough space (size that is greater or equal to m + n) to hold additional elements from​​nums2​​​.
    Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3

Output: [1,2,2,3,5,6]

解题思路

就是归并排序的思路, 但是要注意, 由于并没有额外的申请新的空间, 而是将数组保存到 ​​nums1​​​ 上, 因此在 ​​nums1​​​ 中需要从后向前开始排序, 并且还要将 ​​nums1​​​ 中元素中与 ​​nums2​​​ 的元素中选出最大的开始比较. 另外还需要注意 ​​m​​​ 和 ​​n​​​ 不能同时为 ​​0​​​, 但可以有一个为 ​​0​​.

扩展阅读: 这种从后向前考虑问题的题还可以看: ​​977. Squares of a Sorted Array*​​​ 以及 ​​240. Search a 2D Matrix II**​

C++ 实现 1

class Solution {
public:
// 注意题目已经假设 nums1 的大小至少和 m + n 一样大
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 这里在两者都小于 1 的情况下才返回, leetcode 有一个测试用例就是 m = 0,
// n = 1 这样也是可以的.
if (m < 1 && n < 1)
return;
// 在 nums1 的末尾开始, 实现两个数组的归并.
int k = m + n - 1;
int i = m - 1, j = n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] < nums2[j])
nums1[k--] = nums2[j--];
else
nums1[k--] = nums1[i--];
}

while (i >= 0)
nums1[k--] = nums1[i--];
while (j >= 0)
nums1[k--] = nums2[j--];
}
};