给你两个有序整数数组 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
-109 <= nums1[i], nums2[i] <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
既然题目都给我把扩展后空间的num1了,那么直接把num2的内容装载入num1扩展的内容后面,再sort一波即可!代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i = m; i < m + n; i ++){
nums1[i] = nums2[i - m];
}
sort(nums1.begin(), nums1.end());
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/cqiao-yong-gui-ze-by-heroding-99n5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
且慢!不可以就这样满足了,其实我们都知道,出题者本意不是想让我们直接调用sort函数解决问题的,那么如何解决呢?双指针!双指针从后往前(必须这样,不然容易覆盖),比较指针位置的大小,大的就放入num1后面,直到填充满,代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int index = m + n - 1;
m = m - 1, n = n - 1;
while(m >= 0 || n >= 0) {
if(m < 0) {
nums1[index --] = nums2[n --];
} else if(n < 0) {// 只剩下num1了,直接break
break;
} else if(nums1[m] < nums2[n]) {
nums1[index --] = nums2[n --];
} else {
nums1[index --] = nums1[m --];
}
}
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/cshuang-zhi-zhen-by-heroding-5wcn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/