第一种常规解法见上篇文章
下面来介绍第二种解法---双指针解法
即给nums1和nusm2各自一个指针P1,P2
将两个指针的数字进行比较,小的放在一个temp的临时数组中
等p1,p2遍历完所有的数组后,将temp赋值给nums1中即可
代码附上:
class Solution(object):
def merge(self, nums1, m, nums2, n):
# 创建临时数组
temp = []
p1, p2 = 0, 0 # 双指针初始化
# 双指针遍历两个数组
while p1 < m and p2 < n:
if nums1[p1] <= nums2[p2]:
temp.append(nums1[p1])
p1 += 1
else:
temp.append(nums2[p2])
p2 += 1
# 处理 nums1 剩余元素
if p1 < m:
temp.extend(nums1[p1:m])
# 处理 nums2 剩余元素
if p2 < n:
temp.extend(nums2[p2:n])
# 将结果覆盖回 nums1
nums1[:] = temp
知识点:
extend() 函数的功能:
用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
nums1[p1:m]
切片范围是从索引 p1(包含)到索引 m(不包含)之间的元素,形成一个新列表
nums1[:] = temp
切片范围是从索引 p1(包含)到索引 m(不包含)之间的元素,形成一个新列表
那么有小伙伴就会问了,煮波煮波,你为什么不用 nums1 = temp
这里就要讲解下一个概念,变量是标签,不是盒子
例如 nums1 = [1,2,3] 这意思将标签nums1贴在列表[1,2,3]上
而 nums1 = temp就是将nums1撕下来,贴到temp这个盒子上
原来的列表很显然没有改变,这会导致一个什么情况嘞
如果原来的这个列表是从其他地方传进来的,外面就感知不到它的变化!
而nums1[p1:m] ,保持了nums1标签贴在原来的列表上,然后清空内容,将temp的内容复制进去,对原列表直接进行修改,这样,外部可以感知到变化了
总结:
nums1 = temp → 换标签(原列表未变,外部感知不到)。
nums1[:] = temp → 改内容(原列表被覆盖,外部能看到变化)。