您的位置:首页 > 其它

Leetcode - Merge Sorted Array

2016-04-18 16:49 393 查看

Question

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note

You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

JavaCode

//版本一: 归并排序,从小下标开始遍历两个数组,结果暂存在一个新数组中
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i=0;
int j=0;
int k=0;
int[] nums = new int[m + n];
while(i < m && j < n) {
if(nums1[i] < nums2[j])
nums[k++] = nums1[i++];
else if(nums1[i] > nums2[j])
nums[k++] = nums2[j++];
else {
nums[k++] = nums1[i++];
nums[k++] = nums2[j++];
}
}

//拷贝两个数组中可能剩余的有序元素
// while(i < m) { nums[k++] = nums1[i++]; }
// while(j < n) { nums[k++] = nums2[j++]; }
if(i < m) System.arraycopy(nums1, i, nums, k, m-i);
if(j < n) System.arraycopy(nums2, j, nums, k, n-j);

System.arraycopy(nums, 0, nums1, 0, m+n);
}

//版本二: 归并排序,从大下标开始遍历两个数组,结果可直接保存在nums1数组中
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(n == 0) return;
if(m == 0) {
System.arraycopy(nums2, 0, nums1, 0, n);
return;
}

int k = m+n-1;
m--;
n--;
while(m >= 0 && n >= 0) {
if(nums1[m] > nums2
)
nums1[k--] = nums1[m--];
else if(nums1[m] < nums2
)
nums1[k--] = nums2[n--];
else {
nums1[k--] = nums1[m--];
nums1[k--] = nums2[n--];
}
}

//拷贝nums2中可能剩余的有序元素
//while(n >= 0) { nums1
= nums2
; n--;}
System.arraycopy(nums2, 0, nums1, 0, n+1);
}


说明

本题中给出的两个方法大同小异,都使用了归并排序,但是版本二的方式无需使用额外的空间,可以避免不必要的数组拷贝,时间复杂度为O(n)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息