1. 程式人生 > >【Lintcode】合併排序陣列&& 合併排序陣列 II

【Lintcode】合併排序陣列&& 合併排序陣列 II

題目描述:合併兩個排序的整數陣列A和B變成一個新的陣列。

注意事項
你可以假設A具有足夠的空間(A陣列的大小大於或等於m+n)去新增B中的元素。

樣例給出 A = [1, 2, 3, empty, empty], B = [4, 5]
合併之後 A 將變成 [1,2,3,4,5]

思路:既然是合併有序的陣列,那麼我們肯定想到一個一個去比較,如果A的第一個數大於B的第一個數,就將A整體向後移動,然後將B的第一個數插入;如果A的第一個數小於B,那麼就將A向後移動,看A第二個數和B第一個數的比較,以此類推。這種思路去實現的時候很容易出現問題,比如牽扯到拷貝的問題,比如可能會產生判斷問題。

還有種思想就是既然它已經是有序的,我們可以從後向前進行比較,如果最後A最後一個都比B第一個小,那麼就不需要移動A,直接將B插入到A的後面,如果A的最後一個比B大,那麼它也比B中其他元素大,所以將它移動到最後,接著再去比較A的倒數第二個和B倒數第一個的大小。

到這裡其實思路已經很明顯了,在寫程式碼之前,我們可以先將可能出現的測試用例寫出來,比如:
A={9,10,11,12,13},B={4,5,6,7}
A={},B={1,2,3,4}
A={1,2,3},B={}
A={1,2,3},B={4,5,6}

所以程式碼如下:

void mergeSortedArray(int A[], int
m, int B[], int n) { // write your code here int pos=m+n-1; int i=m-1; int j=n-1; while(i>=0 && j>=0) { if(A[i]>B[j]) { A[pos--]=A[i--]; } else { A[pos
--]=B[j--]; } } while(j>=0) { A[pos--]=B[j--]; } }

緊接著,我們對這個面試題升級。

題目描述:合併兩個排序的整數陣列A和B變成一個新的陣列。

樣例
給出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

思路:對這個題而言,既然是返回一個新的陣列,那我們從頭開始比較然後插入到新陣列中。當其中一個數組已經插入完,那麼另外一個數組可直接插入到新陣列的後面。程式碼如下:

vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
        // write your code here
        vector<int> res;
        int s1=A.size();
        int s2=B.size();
        if(s1==0) return B;
        if(s2==0) return A;


        int i=0;
        int j=0;
        while(s1&&s2)
        {
            if(A[i]>B[j])
            {
                res.push_back(B[j]);
                j++;
                s2--;
            }
            else
            {
                res.push_back(A[i]);
                i++;
                s1--;
            }
        }

        if(s2==0)
        {
            while(s1)
            {
                res.push_back(A[i]);
                i++;
                s1--;
            }
        }

        if(s1==0)
        {
            while(s2)
            {
                res.push_back(B[j]);
                j++;
                s2--;
            }
        }
        return res;
    }