两个有序数组nums1和nums2,将nums2合并到nums1中,使nums1成为一个有序数组。
初始化nums1和nums2的元素数量分别为m和n。
假设nums1的空间大小等于m+n(足够)。
- 一般解法,先拷贝,再排序
package main
import (
"fmt"
"sort"
)
func merge(nums1 []int, m int, nums2 []int, n int)[]int{
copy(nums1[m:], nums2)
sort.Ints(nums1)
return nums1
}
func main(){
var nums1 = [9]int{1,3,5,7,9}
var nums2 = [...]int{2,4,6,8}
fmt.Println(merge(nums1[:], 5, nums2[:],4))
}
- 使用双指针
func merge2(nums1 []int, m int, nums2 []int, n int)[]int{
var nums1Copy = make([]int, m+n)
copy(nums1Copy, nums1)
var p1 = 0//指向nums1Copy
var p2 = 0//指向nums2
var p = 0//指向nums1
for p1<m && p2<n{
switch {
case nums1Copy[p1]<=nums2[p2]:
nums1[p] = nums1Copy[p1]
p++
p1++
default:
nums1[p] = nums2[p2]
p++
p2++
}
}
if p1<m{//nums1Copy中的元素还未取完,已经取了p1个
copy(nums1[p:], nums1Copy[p1:])
}
if p2<n{//num2中的元素还为取完,已经取了p2个
copy(nums1[p:], nums2[p2:])
}
return nums1
}
- 双指针改进版(空间复杂度降低,不使用额外空间)
func merge3(nums1 []int, m int, nums2 []int, n int)[]int{
// 从后往前遍历
// nums1[m-1] ... nums1[0]
// nums2[n-1] ... nums2[0]
var p1 = m-1
var p2 = n-1
var p = m+n-1
for p1>=0 && p2>=0{
switch {
case nums1[p1]>=nums2[p2]:
nums1[p] = nums1[p1]
p--
p1--
default:
nums1[p] = nums2[p2]
p--
p2--
}
}
if p1>0{//nums1中的元素还未取完
copy(nums1[:p], nums1[:p1])
}
if p2>0{//nums2中的元素还未取完
copy(nums1[:p], nums2[:p2])
}
return nums1
}