美文网首页lintcode
64. 合并排序数组 II

64. 合并排序数组 II

作者: 和蔼的zhxing | 来源:发表于2017-12-18 18:07 被阅读28次

    合并两个排序的整数数组A和B变成一个新的数组。
    注意事项
    你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。
    样例
    给出A = [1, 2, 3, empty, empty], B = [4, 5]
    合并之后 A 将变成 [1,2,3,4,5]

    这个主要是要求原位操作,并且给的是数组形式而不是vector的。

    三指针+从后向前

    因为要原位操作,所以没有额外的空间,需要从后向前,两根指针分别指向两个数组的末尾,另外一根指针指向A的末尾(题目假设有这么多的空间只是没有赋值)。然后比较两个数组指向对象的大小,根据不同大小的情况决定把那个放入A的末尾,这样就能保证不会把未放入的覆盖掉,极限情况是B的所有的数都比A 的大,这样也不会覆盖掉A的最后一个数,写起来也比较简单:注意完了之后处理一下没有遍历完的那一个数组。

     void mergeSortedArray(int A[], int m, int B[], int n) {
           //三个指针
            int pos=m+n-1;
            int posA=m-1;
            int posB=n-1;
            while(posA>=0&&posB>=0)
            {
                if(A[posA]>B[posB])
                {
                    A[pos]=A[posA];
                    posA--;
                    pos--;
                }
                else if(A[posA]<B[posB])
                {
                    A[pos]=B[posB];
                    posB--;
                    pos--;
                }
                else
                {
                    A[pos]=A[posA];
                    pos--;
                    posA--;
                    A[pos]=B[posB];
                    pos--;
                    posB--;
                }
                
            }
            while(posA>=0)
            {
                A[pos]=A[posA];
                pos--;
                posA--;
            }
            while(posB>=0)
            {
                A[pos]=B[posB];
                pos--;
                posB--;
            }
            // write your code here  
        }
    };
    

    相关文章

      网友评论

        本文标题:64. 合并排序数组 II

        本文链接:https://www.haomeiwen.com/subject/avimwxtx.html