难度 easy
给你两个有序整数数组 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
解题思路:这道题是非常简单的,因为nums1的大小都给出来了,所以我们只要用归并排序的思路把nums2的元素添加到nums1中即可,我们选择从后往前遍历,这样新添加进来的元素就自然地添加到数组末端了,我们就不用考虑从前往后添加的过程中涉及的顺序改变的问题了。
代码 t100 s15 java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(n==0) return;
if(m==0){
for(int k=0; k<n; k++){
nums1[k] = nums2[k];
}
return;
}
int p1 = m-1, p2 = n-1;
for(int i=m+n-1; i>=0; i--){
if(p1<0 || p2<0) break;
if(nums1[p1]>=nums2[p2]){
nums1[i] = nums1[p1];
p1--;
}else{
nums1[i] = nums2[p2];
p2--;
}
}
if(p1<0){
for(int j=p2; j>=0; j--){
nums1[j] = nums2[j];
}
}
}
}
下面的题解是7个月前提交的cpp版本,应该是参考了网上的资料写的,十分简洁,思路一样的。
代码 t64 s12 cpp
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int k=m+n-1, i=m-1, j=n-1;
while(j>=0){
nums1[k--] = (i>=0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
}
}
};