1.题目
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
2.思路
方法1:
采用逆向双指针,从两个数组的末尾开始向前遍历,每次遍历比较下当前指针i,j指向数组值的大小,将大的那个放到nums1数组的末尾。如果两个数组都遍历完了,nums2中的数组还是没有全放到nums1中,说明,nums2数组中j指针指向的元素及其前面的元素都小于nums1数组中的值,所以可以直接将nums2中从下标0开始的j+1个数(j指的下标,所以这里要+1)全部拷贝到nums1中,从nums1中下标为0 的地方开始存储
方法2:
将数组nums2直接放在数组nums1的后面,这样就合并了两个数组,之后在对nums1排序
3.答案
方法1:逆向双指针
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//采用逆向双指针
int i=m-1; //指向nums1数组末尾
int j=n-1; //指向nums2数组末尾
int len=m+n-1; //用来记录合并后数组的下标
while(i>=0&&j>=0){
//比较nums1中i指向的值和nums2中j指向的值,每次都选最大的放在数组后面
nums1[len--] = (nums1[i]>nums2[j]) ? nums1[i--] : nums2[j--];
}
//有可能nums2中有值小于nums1中的所有值,上述循环完后,nums2中的值并没有全部放入nums1中
//如果nums2中的值全放入num1中,下面的数组拷贝对最终结果也没什么影响
//表示将nums2数组从下标0位置开始,拷贝到nums1数组中,从下标0位置开始,长度为len2+1
System.arraycopy(nums2,0,nums1,0,j+1);
}
}
方法二:直接合并两个数组后排序
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i=0; i<n; i++){
nums1[m+i]=nums2[i];
}
Arrays.sort(nums1);
}
}