每日一题之 两个有序数组合并

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/u014046022/article/details/83896468