面试题 10.01.合并排序的数组

Posted lngstart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 10.01.合并排序的数组相关的知识,希望对你有一定的参考价值。

原题链接

题解

方式一:利用额外的空间

开一个额外的空间存放数据,最后再放回去

代码如下
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int i = 0, j = 0; int t[1010]; int k = 0;
        while(i < m && j < n){
            if(A[i] < B[j]){
                t[k ++] = A[i ++];
            }
            else{
                t[k ++] = B[j ++];
            }
        }
        while(i < m) t[k ++] = A[i ++];
        while(j < n) t[k ++] = B[j ++];
        for(int i = 0; i < n + m; ++ i){
            A[i] = t[i];
        }
    }
};

方式二:原地逆序归并

因为题目中在A中已经开了足够的空间放在后面,可以逆序的来归并,就不需要移动了,直接在原地进行操作

代码如下
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
       //使用原地逆序归并,就不需要额外的空间了
       int i = m - 1, j = n - 1, k = m + n - 1;
       while(i >= 0 && j >= 0){
           if(A[i] < B[j]) A[k --] = B[j --];
           else A[k --] = A[i --];
       }

       while(j >= 0) A[k --] = B[j --];//因为如果是A中的数据多了,那么他的顺序就直接是好的
    }
};

以上是关于面试题 10.01.合并排序的数组的主要内容,如果未能解决你的问题,请参考以下文章

面试题 10.01. 合并排序的数组

数组面试题 10.01. 合并排序的数组

[LeetCode] 面试题 10.01.合并排序的数组

最强解析面试题:合并两个排序的链表

[剑指offer]面试题17:合并两个排序的链表

剑指OFFER----面试题25. 合并两个排序的链表