给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- − 1 0 9 -10^{9} −109<= nums1[i], nums2[i] <= 1 0 9 10^{9} 109
题解
由于两个数组是已经排好序的,并且需要将数组合并到nums1的后面,故我们可以使用两个指针分别指向两个数组的结尾,然后比较两个指针指向的数的大小,将大的数放到扩大m个容量后的nums1的末尾,所以我们还需要一个指针指向这个末尾。
所以我们可以先用m, n指向nums1, nums2的末尾,使用新的指针pos指向扩大容量后的nums1的末尾,即初始化pos=m+n-1。
然后就可以开始使用双指针m, n分别遍历nums1, nums2了。
若nums1遍历完而 nums2还未遍历完,我们还需要将nums2中未遍历到的数据复制到nums1中。若nums2遍历完而 nums1还未遍历完,由于nums1剩下的还是有序的,故可不用操作。
代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos = m-- + n-- - 1;
while(m >= 0 && n >= 0)
{
nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
}
while(n >= 0)
{
nums1[pos--] = nums2[n--];
}
}
};