题目
给你两个有序整数数组A 和 B,请你将 B 合并到 A 中,使 A 成为一个有序数组。
初始化 A 和 B 的元素数量分别为 m 和 n 。你可以假设 A 的空间大小等于 m + n,这样它就有足够的空间保存来自 B 的元素。
注意:只需要存入A即可,最后需要将新数组的元素存入A。
解这道题有两种思路
第一,新建一个数组res,AB两个数组每个元素相比后,小元素存入新数组res。后需要将res的元素存入A
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int[] res = new int[m+n];
int i = 0;
int j = 0;
int f = 0;
while(i < m && j < n){
if(A[i] > B[j]){
res[f++] = B[j++];
}else{
res[f++] = A[i++];
}
}
while(i < m){
res[f++] = A[i++];
}
while(j < n){
res[f++] = B[j++];
}
for (int k=0;k<res.length;k++){//将新数组的元素依次赋值给nums1
A[k]=res[k];
}
}
}
第二种思路。
因为A的长度等于m+n,可以保证将B中元素全部插入后不溢出,那么直接将B插入A就完事儿了。将两个指针i和j分别放在a和b的最后一个元素,新建一个指针f放在n+m-1处(最后一个位置,但不是最后一个元素),让两个指针从后往前比较,将较大的那个插入进去。移动时要么是i-- && f-- ,要么是j-- && f--。最终A或者B中元素可能有剩余,如果A中剩余,因为其本身就在A中,不用处理这种情况。B中剩余,则全部插入到A中。
需要注意的是,初始化的时候,i=m-1,而不是m。循环条件也是i>=0,而不是>0。
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int i = m - 1;
int j = n - 1;
int f = n + m - 1;
while(i >= 0 && j >= 0){
if(A[i] > B[j]){
A[f--] = A[i--];
}else{
A[f--] = B[j--];
}
}
while(j >= 0){
A[f--] = B[j--];
}
}
}