版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014046022/article/details/83896468
描述:
给定两个有序数组 A,B,在不用临时缓冲区的情况下将两个数组合并,假设A数组有足够大的空间
思路:
题意就是把A,B两个数组都合并到A中,写过有序链表合并的都知道,可以从头开始比较两个节点之间的大小然后依次连接,这种是确认最小的值一定在前面的情况,那么对于此题呢?我们可以反过来想,既然两个数组都有序,那么最大的值一定会被放在最后的位置,以此类推,可以从两数组的最后一个数比较,将较大的数放在最终的位置。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7;
int A[maxn];
int B[maxn];
void solve(int A[], int n, int B[], int m) {
int len = m+n-1;
--m;
--n;
while(n >= 0 && m >= 0) {
if (A[m] > B[n]) {
A[len--] = A[m];
--m;
}
else {
A[len--] = B[n];
--n;
}
}
while(n >= 0) {
A[len--] = B[n--];
}
}
int main() {
int m,n;
cin >> m >> n;
for (int i = 0; i < m; ++i)
cin >> A[i];
for (int i = 0; i < n; ++i)
cin >> B[i];
solve(A, m, B, n);
for (int i = 0; i < m+n; ++i)
cout << A[i] << " ";
return 0;
}