题目
https://leetcode-cn.com/problems/merge-sorted-array/
代码(双指针)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(m==0){
for(int q=0;q<nums1.length;q++){
nums1[q]=nums2[q];
}
}
if(n==0) return;
int i=0;
int j=0;
int[] res=new int[nums1.length];
int k=0;
while(i<m&&j<n){
if(nums1[i]<=nums2[j]){
res[k]=nums1[i];
k++;
i++;
}
else{
res[k]=nums2[j];
k++;
j++;
}
}
while(i<m){
res[k]=nums1[i];
k++;
i++;
}
while(j<n){
res[k]=nums2[j];
k++;
j++;
}
for(int q=0;q<nums1.length;q++){
nums1[q]=res[q];
}
}
}
代码(从后往前遍历)
从后往前,可以省去排序数组的空间,使得空间复杂度由o(m+n)变为o(1)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int tail=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0&&j>=0){
if(nums1[i]>=nums2[j]){
nums1[tail]=nums1[i];
tail--;
i--;
}
else{
nums1[tail]=nums2[j];
tail--;
j--;
}
}
while(i>=0){
nums1[tail]=nums1[i];
tail--;
i--;
}
while(j>=0){
nums1[tail]=nums2[j];
tail--;
j--;
}
}
}