https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150
88. 合併兩個有序陣列
已解答
給你兩個按 非遞減順序 排列的整數陣列 nums1
和 nums2
,另有兩個整數 m
和 n
,分別表示 nums1
和 nums2
中的元素數目。
請你 合併 nums2
到 nums1
中,使合併後的陣列同樣按 非遞減順序 排列。
注意:最終,合併後陣列不應由函式返回,而是儲存在陣列 nums1
中。為了應對這種情況,nums1
的初始長度為 m + n
,其中前 m
個元素表示應合併的元素,後 n
個元素為 0
,應忽略。nums2
的長度為 n
。
示例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合併 [1,2,3] 和 [2,5,6] 。 合併結果是 [1,2,2,3,5,6] ,其中斜體加粗標註的為 nums1 中的元素。
示例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合併 [1] 和 [] 。 合併結果是 [1] 。
示例 3:
輸入:nums1 = [0], m = 0, nums2 = [1], n = 1 輸出:[1] 解釋:需要合併的陣列是 [] 和 [1] 。 合併結果是 [1] 。 注意,因為 m = 0 ,所以 nums1 中沒有元素。nums1 中僅存的 0 僅僅是為了確保合併結果可以順利存放到 nums1 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
進階:你可以設計實現一個時間複雜度為 O(m + n)
的演算法解決此問題嗎?
go
func merge(nums1 []int, m int, nums2 []int, n int) { i := m - 1 j := n - 1 h := m + n - 1 for { if j < 0 && i < 0 { break } if i < 0 && j >= 0 { nums1[h] = nums2[j] j-- h-- continue } if j < 0 && i >= 0 { nums1[h] = nums1[i] i-- h-- continue } if nums1[i] >= nums2[j] { nums1[h] = nums1[i] i-- h-- } else { nums1[h] = nums2[j] j-- h-- } } }