题目描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
解法一:
直接将两数组合并,然后再对 nums1 中所有元素进行排序。但这样做没有利用两数组本身有序的条件。
代码实现:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
解法二:
由于最后元素都要放入到数组 nums1 中,所以先将 nums1 中元素放入其他数组(nums)中以备使用。定义 x 、y 分别指向 nums 和 nums2 的开头,每次向后移动过程中将较小值放入 nums1 中。
代码实现:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums=new int[m];
System.arraycopy(nums1,0,nums,0,m);
int x=0,y=0,z=0;
while((x<m)&&(y<n)){
nums1[z++]=nums[x]<nums2[y]?nums[x++]:nums2[y++];
}
if(x<m){
System.arraycopy(nums,x,nums1,x+y,m+n-x-y);
}
if(y<n){
System.arraycopy(nums2,y,nums1,x+y,m+n-x-y);
}
}
}