返回

「双指针」精解 LeetCode 88:合并两个有序数组(详细步骤 + 代码示例)

前端

算法导论

「双指针」算法是一种用于处理有序数据的常见算法。它使用两个指针来遍历两个有序数组,并比较当前指针指向的元素。较小的元素被添加到合并后的数组中,指针指向下一个元素。这个过程重复进行,直到两个指针都指向最后一个元素。

合并两个有序数组步骤

  1. 初始化两个指针 :将指针p1和p2分别指向nums1和nums2的第一个元素。
  2. 比较指针指向的元素 :如果p1指向的元素小于或等于p2指向的元素,则将p1指向的元素添加到合并后的数组中,并将p1指向下一个元素。否则,将p2指向的元素添加到合并后的数组中,并将p2指向下一个元素。
  3. 重复步骤2 :继续比较指针指向的元素,并添加到合并后的数组中,直到p1或p2指向最后一个元素。
  4. 添加剩余元素 :如果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 题,还可用于解决其他类似的问题。掌握「双指针」算法,将使您在解决数组操作问题时更加得心应手。

扩展阅读