题目描述
给你两个有序整数数组 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]
这个题的思路很简单,设置两个指针,一个指向nums1的起始位置,一个指向nums2的起始位置,谁小就先把谁放到数组中,然后该指针向后移动。
但这里需要额外的数组来储存,我一开始犯的错误是没有新建一个数组,导致元素之间的覆盖,原来的数据丢失,结果错误。
代码:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int flag1 = 0;
int flag2 = 0;
int i = 0;
int nums[] = new int[m+n];
while(flag1 < m && flag2 < n){
if(nums1[flag1] <= nums2[flag2]){
nums[i] = nums1[flag1];
flag1++;
i++;
}else{
nums[i] =nums2[flag2];
flag2++;
i++;
}
}
if(flag1 <= m-1){
while(flag1 < m){
nums[i++] = nums1[flag1++] ;
}
}else if(flag2<=n-1){
while(flag2 <n){
nums[i++] = nums2[flag2++];
}
}
for(int j = 0;j<m+n;j++){
nums1[j] = nums[j];
}
}
}
可将上述代码进行优化:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int flag1 = 0;
int flag2 = 0;
int i = 0;
int nums[] = new int[m+n];
while(flag1 < m && flag2 <n){
// if(nums1[flag1] <= nums2[flag2]){
// nums[i++] = nums1[flag1++];
// }else{
// nums[i++] = nums2[flag2++];
// }
nums[i++] = (nums1[flag1]<=nums2[flag2])?nums1[flag1++]:nums2[flag2++];
}
if(flag1<m){
// while(flag1<m){
// nums[i++]=nums1[flag1++];
// }
System.arraycopy(nums1,flag1,nums,flag1+flag2,m+n-flag1-flag2);
}
if(flag2<n){
// while(flag2<n){
// nums[i++] = nums2[flag2++];
// }
System.arraycopy(nums2,flag2,nums,flag1+flag2,m+n-flag2-flag1);
}
System.arraycopy(nums,0,nums1,0,m+n);
}
}
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度