文章目录
88. 合并两个有序数组题目思路代码1、直接copy再sort(耍赖做法)2、双指针法3、奇妙法:双指针从后往前遍历比较
88. 合并两个有序数组
来源:力扣(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尾,依次倒序加入。
代码
1、直接copy再sort(耍赖做法)
class Solution {
public void merge(int
[] nums1
, int m
, int
[] nums2
, int n
) {
System
.arraycopy(nums2
,0,nums1
,m
,n
);
Arrays
.sort(nums1
);
}
}
2、双指针法
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
);
}
}
3、奇妙法:双指针从后往前遍历比较
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
--];
}
}
}