Merge Sorted Array
?
?
来自 <https://leetcode.com/problems/merge-sorted-array/>
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?nums1and?nums2?are?m?and?n?respectively.
?
题目解读:
给定两个整型数组nums1?和nums2,将数组nums2中的元素归并到数组nums1中。题目已经假设数组nums1?中拥有足够的空降将数组nums2?中的元素加入到其中。
?
解析:
?
方法一:按照最常规的方法从前往后归并。申请一个空间为m+n的数组nums3?,将两个数组中的元素归并到数组nums3?中,程序结束时再将数组nums3?中的元素复制到数组nums1?中。此方法必须申请额外的空间来存储数组nums3?,并且在还得数组nums3?中的数据复制到数组nums1?中,此方法拥有较高的时间和空间复杂度。
?
方法二:
?
从后向前归并。由于数组nums1?拥有足够的空间可以容纳m+n个元素,则可以利用nums1中的空间进行从后向前归并。i记录nums1中最后一个元素的位置,j记录nums2中最后一个元素的位置,k记录两个数组归并后最后一个元素的位置。图解如下图所示

?
?
Java 代码
public void merge(int[] nums1, int m, int[] nums2, int n) {
if((nums1==null) && (nums2==null))
return;
/**
* 记录nums1中最后一个元素的位置
*/
int i = m-1;
/**
* 记录nums2中最后一个元素的位置
*/
int j = n-1;
/**
* 记录归并结束后最后一个元素的位置
*/
int k = m+n-1;
while ((i>=0) && (j>=0)) {
if(nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
//add remains elements to result
while(j>=0) {
nums1[k--] = nums2[j--];
}
for(int a: nums1)
System.out.print(a + ",");
}
?算法性能

?
Leetcode-88-Merge Sorted Array
原文:http://972459637-qq-com.iteye.com/blog/2238044