题解:
解法一:从后向前同时遍历两个数组,因为nums1后面是0,从后遍历节省空间。
1、定义三个指针,分别为:len1=m-1指向nums1的最后一个非0数字;len2=n-1指向nums2的最后一个数字;len3=m+n-1指向nums的最后一个位置。
2、当len1与len2都大于等于0时即nums1与nums2都没有遍历完时:
(1)如果nums2[len2]>nums1[len1],则将nums2[len2]移动到nums1[len3]的位置并使len2向前移动1即len2--;
(2)如果nums2[len2]<=nums1[len1],则将nums1[len1]移动到nums1[len3]的位置并使len3向前移动1即len1--;
(3)无论执行(1)还是(2)都需要将len3向前移动1位;
3、执行完2中的while循环时,当len2<0则代表nums2先遍历完成即nums2中的元素已经完全并入nums1即已完成题目要求;当len1<0则代表nums1先遍历完成但nums2中仍有元素存在即nums2中剩余的元素小于nums1[0],此时则需要将nums[0:len2+1]赋值给nums1[0:len2+1]。
解法二:将数组nums2赋值给nums1[m:],用nums1.sort()排序。(面试官不希望用此法解题)
代码:
解法一:空间复杂度O(1),时间复杂度O(m+n)
解法二: