合并两个有序数组-双指针-基于Go

两个有序数组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
}
posted @ 2021-04-08 09:50  pangqianjin  阅读(257)  评论(0编辑  收藏  举报