88. Merge Sorted Array

88. Merge Sorted Array

 思路一:把nums2直接复制到nums1中,然后sort,但是你会发现地址在sort时返回的地址已经发生改变,所以这种解法是不对的。

class Solution:
    def merge1(self,nums1,m,nums2,n):
        print(id(nums1))
        len1 = len(nums1)
        len2 = n
        for i in range(len1-len2,len1):
            nums1[i] = nums2[i-(len1-len2)]
        print(id(nums1))
        nums1 = sorted(nums1)
        print(id(nums1))#此时nums1的地址被sorted改变,所以nums1是新地址,不符合题中不能用新空间
        #print(nums1)
        nums1 = nums1[(len1-m-n):]
        print(id(nums1))#肯定首地址都发生变化了
        return nums1
        #print(nums1)

先贴出来,等下分析关于python的复制时地址的问题。

思路二:尽量对nums1进行改变,把大的数从后向前复制,并保持nums1的地址一直没有发生改变

 1     def merge2(self, nums1, m, nums2, n):
 2         a = m-1
 3         b = n-1
 4         c = m + n -1
 5         if n == 0:
 6             pass
 7         elif 0 == m:
 8             nums1[:n] = nums2[:n]
 9         else:
10             while (a >= 0)and(b >= 0):
11                 if nums1[a] <= nums2[b]:
12                     nums1[c] = nums2[b]
13                     b = b-1
14                     c = c-1
15                 else:
16                     nums1[c] = nums1[a]
17                     c = c-1
18                     a = a-1
19             if a >= 0:
20                 pass
21             if b >= 0:
22                 nums1[:b+1] = nums2[:b+1]
23             return nums1



接下来分析下nums1 = ......和nums1[:]前者复制地址会发生变化后者不会发生任何改变的原因:


到这里我们就明白了为何要使用 nums1[:]。这里 sorted() 函数返回的必然是一个新的对象,因此我们需要 nums1[:], 而 [] 也代表一个新的 list 对象,我们需要用 nums1[:] = []。
ps: 如果没有就地修改的要求,则用 nums1 也是完全正确的。
因此对思路一进行代码修改,顺利通过
1 class Solution:
2     def merge(self,nums1,m,nums2,n):
3         len1 = len(nums1)
4         len2 = n
5         for i in range(len1-len2,len1):
6             nums1[i] = nums2[i-(len1-len2)]
7         print(id(nums1))
8         nums1[:] = sorted(nums1)#加冒号指向自己的地址,不加冒号指向新的被赋值地址
9         nums1[:] = nums1[(len1-m-n):]

下面讲一下关于list的一些操作

 

 
原文地址:https://www.cnblogs.com/henuliulei/p/13230577.html