88.合并两个有序数组

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//优先对数组nums1进行移动,要进行倒序移动否则例如[1,2,3,0],
//正序移动0移动到1会覆盖1的数据。
for(int i = m -1;i >= 0;i--){
nums1[i + n] = nums1[i];
}
int i = 0; //视为一个新的数组的索引
int i1 = n; //数组nums1的索引
int i2 = 0; //数组nums2的索引
while(i1 < m + n || i2 < n){
//有两种情况取nums1的值
//1.当nums1的数据取完并且nums2中还有元素时
//2.当两个数组都有元素并且 nums1[i1] < nums2[i2]
if(i1 < m + n && (i2 >= n ||( i2 < n && nums1[i1] < nums2[i2]))){
nums1[i] = nums1[i1];
i1++;
}else{
nums1[i] = nums2[i2];
i2++;
}
i++;
}
}
}

如果倒序先把最大的放到末尾可以不用移位。

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m -1;
int j = n -1;
int k = m + n -1;
while(i > -1 || j > -1){
if(i > -1 && (j <= -1 ||( j > -1 && nums1[i] > nums2[j]))){
nums1[k] = nums1[i];
i--;
}else{
nums1[k] = nums2[j];
j--;
}
k--;
}
}
}

优化代码

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m -1,j = n -1, k = m + n -1;
while(i > -1 || j > -1)
nums1[k--]= (i > -1 && (j <= -1 ||( j > -1 && nums1[i] > nums2[j]))) ? nums1[i--]: nums2[j--];
}
}