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.
合并两个有序数组,合并的结果全放在nums1数组中,nums1数组的长度至少为两个数组元素个数之和。
思路:这就跟归并排序一样。
第一种:使用额外数组作为辅助数组。最后将元素赋值给nums1,而不是将nums1指向辅助数组。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public void merge(int[] nums1, int m, int[] nums2, int n) { if(m==0&&n==0) return; if(nums1==null||m==0) { for(int i=0;i<n;i++) nums1[i]=nums2[i]; return ;} if(nums2==null||n==0) return ; int[] tem=new int[m+n]; int i=0; int j=0; int k=0; while(j<n&&i<m){ if(nums1[i]<nums2[j]) tem[k++]=nums1[i++]; else tem[k++]=nums2[j++]; } while(i<m){ tem[k++]=nums1[i++]; } while(j<n){ tem[k++]=nums2[j++]; } for(i=0;i<m+n;i++) nums1[i]=tem[i];
第二种:不使用额外数组。直接防在nums1中,但是由于nums1中有元素,所以从nums1数组的最后开始存放,从大到小往前。
int i=m-1; int j=n-1; int k=m+n-1; while(i>=0&&j>=0){ if(nums1[i]<nums2[j]) nums1[k--]=nums2[j--]; else nums1[k--]=nums1[i--]; } //因为在nums1中操作,所以nums1如果有剩下的元素就不用管了 while(j>=0) nums1[k--]=nums2[j--];