返回

两个指针合并有序数组的技巧

前端

在编程中,我们经常需要处理有序数组。LeetCode 上有一个经典题目:“合并两个有序数组”,要求我们将两个有序数组合并成一个有序数组。本篇博文将介绍一种使用双指针合并两个有序数组的技巧。

双指针算法

双指针算法是一种遍历数组的技巧,它使用两个指针同时遍历数组。一个指针从数组的开头开始,另一个指针从数组的结尾开始。这样,我们可以同时比较两个元素,并将较小的元素放入结果数组中。

具体步骤

  1. 使用 splice 方法,将 nums1 和 nums2 指定位置之后的无关元素去除。
  2. 如果二者其中有一个是空数组,则直接 push 到 nums1 中。
  3. 定义双指针,进行依次比较,小的放到 nums1 中。
  4. 比较完毕后,如果还剩余元素,则直接 push 到 nums1 中。

代码示例

function mergeTwoSortedArrays(nums1, nums2) {
  // 去除无关元素
  nums1.splice(nums1.length, nums2.length);
  nums2.splice(0, nums1.length);

  // 检查是否有空数组
  if (nums1.length === 0) {
    nums1.push(...nums2);
    return nums1;
  }

  if (nums2.length === 0) {
    return nums1;
  }

  // 定义双指针
  let i = 0;
  let j = 0;

  // 比较元素并合并
  while (i < nums1.length && j < nums2.length) {
    if (nums1[i] < nums2[j]) {
      nums1.splice(i, 0, nums2[j]);
      i++;
      j++;
    } else {
      i++;
    }
  }

  // 将剩余元素合并
  if (j < nums2.length) {
    nums1.push(...nums2.slice(j));
  }

  return nums1;
}

相关工具

总结

双指针算法是一种简单高效的合并两个有序数组的方法。它只需要遍历数组一次,就能将两个有序数组合并成一个有序数组。这种算法在实际编程中非常有用,例如在排序、搜索、去重等操作中。