来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
1、直接copy再sort(耍赖做法)
将nums2直接copy到nums1中,再对nums1排序
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);
参数:
src:要复制的数组(源数组)
srcPos:复制源数组的起始位置
dest:目标数组
destPos:目标数组的下标位置
length:要复制的长度
2、双指针法
定义p1、p2分别指向nums1和nums2的当前下标,比较两者nums1[p1] 和nums2[p2],将较小的值加入中间数组temp,当一个数组加入完毕,将剩下的那个数组元素直接加入temp。最终将temp元素copy到nums1即可
3、奇妙法:双指针从后往前遍历比较
类似2的思想,不过从后往前加入元素不用借助中间数组temp,直接用p来指向最终数组nums1的下标进行操作即可,此时选取两者间较大者加入nums1尾,依次倒序加入。
/*
函数的使用
*/
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2,0,nums1,m,n);
Arrays.sort(nums1);//只能做升序排序
}
}
/*
双指针法 + System.arraycopy
*/
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1=0,p2=0,index=0;
int []temp = new int[m+n];
while(p1 < m && p2 < n){
if(nums1[p1] <= nums2[p2]){
temp[index++] = nums1[p1++];
}
else{
temp[index++] = nums2[p2++];
}
}
while(p1 < m){
temp[index++] = nums1[p1++];
}
while(p2 < n){
temp[index++] = nums2[p2++];
}
System.arraycopy(temp,0,nums1,0,m+n);
}
}
/*
奇妙法:双指针从后往前遍历比较
*/
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1=m-1,p2=n-1,p = m+n-1;
while(p1 >= 0 && p2 >= 0){
if(nums1[p1] >= nums2[p2]){
nums1[p--] = nums1[p1--];
}
else{
nums1[p--] = nums2[p2--];
}
}
while(p1 >= 0){
nums1[p--] = nums1[p1--];
}
while(p2 >= 0){
nums1[p--] = nums2[p2--];
}
// System.arraycopy(temp,0,nums1,0,m+n);
}
}