时间复杂度:O(n),空间复杂度:O(1)

解题思路

从后向前修改nums1数组,这样可以避免nums1的数据向后移动。设置三个指针,一个表示插入nums1的下标index,一个表示正在比较的nums1下标i和一个正在比较的nums2下标j,比较两数大小谁大就让nums1[index]等于它。

需要注意i和j会越界(<0),所以需要特别判断,j<0时说明nums2数字已经全部插入到nums1中了,所以可以直接return,但i<0时需要和nums2数字较大时的操作一样,等待所有nums2数字插入到nums1中。

AC代码
func merge(nums1 []int, m int, nums2 []int, n int)  {
    i,j,index:=m-1,n-1,len(nums1)-1
    for j>=0{
        if i<0||nums1[i]<nums2[j]{
            nums1[index]=nums2[j]
            j--
        }else{
            nums1[index]=nums1[i]
            i--
        }
        index--
    }
}
感悟

一开始就想到了思路,但是实现起来遇到了越界问题,本想提前判断的,后来发现代码太复杂不如直接在循环里判断i和j是否越界。