给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入: A = [1,2,3,0,0,0], m = 3 B = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
思路一(普通版):比较A和B的数字,把小的那个存入临时数组
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int pa = 0;
int pb = 0;
vector<int> c;
while(pa<m||pb<n){
//A的数据都存完了
if(pa==m){
c.push_back(B[pb++]);
}
//B的数据都存完了
else if(pb==n){
c.push_back(A[pa++]);
}
else if(A[pa]<=B[pb]){
c.push_back(A[pa++]);
}
else {
c.push_back(B[pb++]);
}
}
for(int i = 0;i<m+n;i++){
A[i] = c[i];
}
}
};
思路二(尾指针):由于题目给定A正好有足够空间容纳B,所以直接从A的尾端开始插入数据
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int pa = m-1; //A前面部分的尾指针
int pb = n-1; //B的尾指针
int tail = m+n-1; //A的尾指针
while(pa>=0||pb>=0){
if(pa==-1){
A[tail--] = B[pb--]; //A的数据已经全部排好了,直接插入B剩下的数据即可
}
else if(pb==-1){
A[tail--] = A[pa--]; //B的数据已经全部排好了,直接插入A剩下的数据即可
}
else if(A[pa]>B[pb]){
A[tail--] = A[pa--]; //A的数据更大,所以放到尾部
}
else {
A[tail--] = B[pb--]; //B的数据更大,所以放到尾部
}
}
}
};