LeetCode88题 合并两个有序数组 (21.3.29)
力扣 88题 合并两个有序数组
题目描述:
给出两个有序整数数组 nums1 和 nums2,请你将nums2合并到nums1中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
涉及内容:数组 双指针
示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
思路:
由于nums1和nums2是有序的,由此我们可以从这出发,直接比较他们当前最大值,把比较结果放在最后
具体就是用i指针指向nums1的m-1下标处,j指针指向nums2的n-1下标处,再用k指针指向nums1的m+n-1下标(即最后一个下标处),然后比较i和j所指的数值的大小,将较大的值赋给k所指的地方,然后k和i(j)做减一处理
最后考虑特殊情况,即存在一个空数组时:
- 若nums1为空,则需要将nums2的数值全覆盖在nums1中
- 若nums2为空,则直接不需要处理输出nums1即可
提交结果:

完整代码:
A=[-6,-4,-3,0,1,5,6,7,0,0,0,0,0]
m=8
B=[1,2,3,8,9]
n=5
i,j,k=m-1,n-1,m+n-1
while i>=0 and j>=0:
if A[i]>B[j]:
A[k]=A[i]
k-=1
i-=1
else:
A[k]=B[j]
k-=1
j-=1
while j>=0: #这个判断是考虑A为空设置的 若A.B有一个为空则直接跳过第一个while循环,此时若B为空,则直接输出A即可
A[k] = B[j]
k -= 1
j -= 1
print(A)
思路2:
将nums2的数据先导入nums1 然后使用sort()
(但、、这样是不是有点没营养)
nums1[m:m+n]=nums2[:n]
nums1.sort()
print(nums1)
浙公网安备 33010602011771号