返回
「双指针」精解 LeetCode 88:合并两个有序数组(详细步骤 + 代码示例)
前端
2023-09-04 13:32:33
算法导论
「双指针」算法是一种用于处理有序数据的常见算法。它使用两个指针来遍历两个有序数组,并比较当前指针指向的元素。较小的元素被添加到合并后的数组中,指针指向下一个元素。这个过程重复进行,直到两个指针都指向最后一个元素。
合并两个有序数组步骤
- 初始化两个指针 :将指针p1和p2分别指向nums1和nums2的第一个元素。
- 比较指针指向的元素 :如果p1指向的元素小于或等于p2指向的元素,则将p1指向的元素添加到合并后的数组中,并将p1指向下一个元素。否则,将p2指向的元素添加到合并后的数组中,并将p2指向下一个元素。
- 重复步骤2 :继续比较指针指向的元素,并添加到合并后的数组中,直到p1或p2指向最后一个元素。
- 添加剩余元素 :如果p1或p2指向最后一个元素,则将剩余元素添加到合并后的数组中。
代码示例
def merge(nums1, m, nums2, n):
"""
合并两个有序数组。
参数:
nums1 (list): 第一个有序数组。
m (int): nums1 的长度。
nums2 (list): 第二个有序数组。
n (int): nums2 的长度。
返回值:
list: 合并后的有序数组。
"""
# 初始化指针
p1 = 0
p2 = 0
# 合并两个数组
while p1 < m and p2 < n:
if nums1[p1] <= nums2[p2]:
nums1[p1 + p2] = nums1[p1]
p1 += 1
else:
nums1[p1 + p2] = nums2[p2]
p2 += 1
# 添加剩余元素
while p1 < m:
nums1[p1 + p2] = nums1[p1]
p1 += 1
while p2 < n:
nums1[p1 + p2] = nums2[p2]
p2 += 1
# 返回合并后的数组
return nums1
时间复杂度
「双指针」算法的时间复杂度为 O(m+n),其中 m 和 n 分别是两个有序数组的长度。
空间复杂度
「双指针」算法的空间复杂度为 O(1),因为算法只需要使用常数个额外的变量。
总结
「双指针」算法是一种高效且易于理解的算法,可用于合并两个有序数组。它不仅适用于 LeetCode 88 题,还可用于解决其他类似的问题。掌握「双指针」算法,将使您在解决数组操作问题时更加得心应手。
扩展阅读