方法一:
从头开始遍历,需要额外的o(n)的空间
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums1tmp = new int[m];
for(int i = 0;i<m;i++){
nums1tmp[i] = nums1[i];
}
int curs1= 0,curs2 = 0,cnt=0;
while(curs1<m && curs2<n){
if(nums1tmp[curs1]<=nums2[curs2]) {
nums1[cnt] = nums1tmp[curs1];
cnt++;
curs1++;
}
else{
nums1[cnt] =nums2[curs2];
cnt++;
curs2++;
}
}
if(curs1<m){
while(curs1<m){
nums1[cnt] = nums1tmp[curs1];
curs1++;
cnt++;
}
}
if(curs2<n){
while(curs2<n){
nums1[cnt] = nums2[curs2];
curs2++;
cnt++;
}
}
}
}
方法二:
从尾开始遍历:
注意到题目的一个条件
尾部有足够的空间,所以借助这个空余的空间可省去重新构建辅助空间的消耗;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int curs1= m-1,curs2 = n-1,cnt=m+n-1;
while(curs1>=0 && curs2>=0){
if(nums1[curs1]>=nums2[curs2]) {
nums1[cnt] = nums1[curs1];
cnt--;
curs1--;
}
else{
nums1[cnt] =nums2[curs2];
cnt--;
curs2--;
}
}
if(curs2>=0){
while(curs2>=0){
nums1[cnt] = nums2[curs2];
curs2--;
cnt--;
}
}
}
}