如歌將兩個陣列合併 演算法 合併兩個有序陣列

2021-10-14 22:06:24 字數 1258 閱讀 1648

給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列

輸入:

nums1 = [1,2,3,0,0,0], m = 3

nums2 = [2,5,6],       n = 3

輸出:[1,2,2,3,5,6]

-10^9 <= nums1[i], nums2[i] <= 10^9

nums1.length == m + n

nums2.length == n

兩個陣列分別有序,且最終要輸出的是陣列一解法如下

將陣列nums2中的元素全部新增到nums1中,對nums1做排序

nums1 的剩餘空間剛好可以存放nums2的元素

nums1和nums2都是有序的。

已知兩個陣列的元素個數

通過分析一直條件我們可以發現,nums1存在一定的後置空間,因此我們可以考慮通過對兩個陣列的末位元素進行對比,然後從後往前插入到nums1中的方法。

所以我們可以用三個指標p0,p1,p2來遍歷陣列:

p0:記錄nums1的新元素位置

p1:記錄nums1原陣列的元素位置

p2:記錄nums2原陣列的元素位置

設定遍歷條件 (p1 >= 0 && p2 >= 0)

比較指標指向的元素大小,將較大的元素放入指標p0的位置,同時移動p0和較大元素的指標。

當遍歷條件為 false時 存在三種情況

p1 == 0   p2 ==0  陣列都遍歷完了

p1 == 0   p2 > 0   nums2沒有遍歷完

p1 > 0   p2 ==0   nums1沒有遍歷完

當結果出現1和3時,nums1恰好是合併排序的最終結果

當出現結果2時,說明nums2中還有剩餘元素,所以繼續移動指標p1,將nums2剩餘元素插入到nums1中就行

public void merge(int nums1, int m, int nums2, int n)  else 

p0--;

}// 處理 nums2 沒有遍歷完的情況

while (p2 >= 0) 

}

o(n + m)o(1)

兩個陣列合併

好久沒寫c c 程式了,手腦都遲鈍了老些,希望自己能夠通過沒日一小題來提高自己,鍛鍊自己。今日題目是,兩個已經排好序的陣列,合併他們並使他們也排好序 程式如下 希望高手們來指教。int mergearray int a,int len1,int b,int len2 while i len1 els...

把兩個陣列合併

將兩個整型公升序資料集合a和b合併成乙個公升序資料集合 例a b 結果 c include define m 7 define n 5 主函式 int main void int b n int c m n merge a,b,c for int i 0 i m n i return 0 方法一 v...

合併兩個陣列

include using namespace std int sortedinsert int a,int lena,int b,int lenb else printf d n a indexnew printf here lena d,lenb d n indexa,indexb indexn...