解法一:在一个循环中遍历两个数组,每次取最小的
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--
}
}