Problem Definiton:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
The number of elements initialized in nums1 and nums2 are m and n respectively.
Solution:
1)如果忽略 “You may assume that nums1 has enough space”,则要先在另一个额外的数组中保存所有元素,再复制回nums1,这样元素一定是最少的:
1 def merge(nums1, m, nums2, n): 2 nums=[0]*(m+n) 3 i,j,k=0,0,0 4 while i<m and j<n: 5 if nums1[i]<=nums2[j]: 6 nums[k]=nums1[i] 7 i+=1 8 else: 9 nums[k]=nums2[j] 10 j+=1 11 k+=1 12 while i<m: 13 nums[k]=nums1[i] 14 i+=1 15 k+=1 16 while j<n: 17 nums[k]=nums2[j] 18 j+=1 19 k+=1 20 nums1[:]=[] ###### 21 nums1+=nums
算法本身没什么好说的,这样要注意的是注释那一行。原题要求不返回nums1而是直接修改。
有一个标签可能叫作aList,它指向内存中的一块连续空间,表示一个数组。
当这个标签作为merge的第一个参数,调用merge时,一个叫做nums1的标签也被挂在了这块内存上。
所以如果把以上程序的第20和21行写成nums1=nums,则相当于:
也就是说,aList指向的那块内存内容并没有被修改。
而如果写成
nums1[:]=[]
nums1+=nums
的意思就相当于,把aList指向的数组(内存)清空,然后把nums的元素一个个append进去。
2)而如果不忽略nums1 has enough space这个条件,就可以在nums1上直接操作。从nums1的末尾开始,倒着来归并。
1 def merge(nums1, m, nums2, n): 2 p=m-1 3 q=n-1 4 r=m+n-1 5 while q>=0: 6 if p<0 or nums2[q]>=nums1[p]: 7 nums1[r]=nums2[q] 8 q-=1 9 else: 10 nums1[r]=nums1[p] 11 p-=1 12 r-=1