合并两个有序数组
使用归并排序的思想
两种方法:第一种指针指向两个数组的第一个位置,移动指针,第二种不添加新数组,在数组1长度可用情况下,把数组2中经过调整添加到数组一种,减小空间复杂度
第一种
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
sorted = []
p1,p2=0,0
while p1<m or p2<n:
if p1==m: #第一个列表指到最后一位,指满了,开始指nums2
sorted.append(nums2[p2]) #把nums中的元素放到列表中
p2+=1
elif p2==n: #第二个列表指到了最后一位,指满了,指nums1
sorted.append(nums1[p1]) #同理
p1+=1
elif nums1[p1]<nums2[p2]:
sorted.append(nums1[p1])
p1+=1
else:
sorted.append(nums2[p2])
p2+=1
nums1[:] =sorted
***时间复杂度为 O(m+n),最多移动m+n次 空间复杂度 O(m+n) 新列表需要建立长度m+n
第二种
使用逆序,把p指针移动到nums列表中最后一个元素的位置,将列表1中的需要交换的元素与列表2中的元素从后往前依次对比,大的使用p赋值到列表1的最后,这种方法的使用有个前提是两数组本身有序
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
p1, p2, p = m - 1, n - 1, m + n - 1
#m为原列表中存放非0的元素个数,p1指向nums2列表长度的最后一位,p指向nums列表的最后一位
while p2 >= 0: # nums2 还有要合并的元素
# 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
if p1 >= 0 and nums1[p1] > nums2[p2]:
nums1[p] = nums1[p1] # 填入 nums1[p1]
p1 -= 1
else:
nums1[p] = nums2[p2] # 填入 nums2[p1]
p2 -= 1
p -= 1 # 下一个要填入的位置
nums1,nums2=[1,3,5,7,0,0,0,0],[2,4,6,8] #列表长度要够大,足够放下nums中的元素
merge(nums1,4,nums2,4)
print(nums1)