合并两个有序数组

14 阅读1分钟

解法一:在一个循环中遍历两个数组,每次取最小的

func merge(nums1 []int, m int, nums2 []int, n int) {
	var result []int
	i, j := 0, 0
	for i < m || j < n {
		//取当前i,j位置的最小值,同时取到值的下标加1
		if i >= m {
			result = append(result, nums2[j])
			j++
			continue
		} else if j >= n {
			result = append(result, nums1[i])
			i++
			continue
		}

		if nums1[i] >= nums2[j] {
			result = append(result, nums2[j])
			j++
		} else if nums1[i] <= nums2[j] {
			result = append(result, nums1[i])
			i++
		}
	}
	//在函数内部重新赋值,不会影响外部!
	//nums1 = result ,是index<m+n,不是m
	for index := 0; index < m+n; index++ {
		//不要用变量i
		nums1[index] = result[index]
	}
}

解法二:逆向思维,为了匹配题目中的只在第一个数组上应用更改,可以从末尾开始匹配

func merge(nums1 []int, m int, nums2 []int, n int) {
	i, j, k := m-1, n-1, m+n-1
	for (i >= 0 || j >= 0) && k >= 0 {
		if j < 0 {
			nums1[k] = nums1[i]
			i--
			k--
			continue
		} else if i < 0 {
			nums1[k] = nums2[j]
			j--
			k--
			continue
		}
		//如果两个需要比较
		if nums1[i] >= nums2[j] {
			nums1[k] = nums1[i]
			i--
		} else {
			nums1[k] = nums2[j]
			j--
		}
		k--
	}
}