情景一

有两个有序数组 nums1 和 nums2, 写一个合并函数,将两个数组合并,返回一个新的有序数组
思路:

  1. 定义两个指针分别指向两个数组的末尾
  2. 声明一个新数组用于存储结果
  3. 比较两个指针指向的数组元素,哪个大就插入到新数组的前面,同时指针往前移动
  4. 当一个数组遍历完成后,将另一个数组的剩余元素都插入到新数组的前面 ```javascript function merge(nums1, nums2) { let len1 = nums1.length - 1 let len2 = nums2.length - 1 const result = [] while (len1 >= 0 || len2 >= 0) { if (len1 < 0) { result.unshift(nums2[len2—]) continue } if (len2 < 0) { result.unshift(nums1[len1—]) continue } result.unshift(nums1[len1] >= nums2[len2] ? nums1[len1—] : nums2[len2—]) }

    return result }

const nums1 = [1, 2, 3, 7, 9, 10] const nums2 = [4, 5, 6, 10, 13] console.log(merge(nums1, nums2))

  1. <a name="ZHJnJ"></a>
  2. ### 情景二
  3. 情景一的解法是不会改变原数组,情景二是会先把 nums1 扩容到 nums1.length + nums2.length 的长度,则可以使用如下解法<br />思路:
  4. 1. 同样用双指针,从后往前比较两个数组的元素
  5. 2. 将大的元素插入到 nums1 的末尾
  6. ```javascript
  7. function merge (nums1, m, nums2, n) {
  8. let len1 = m - 1
  9. let len2 = n - 1
  10. let len = m + n - 1
  11. while (len2 >= 0) {
  12. if (len1 < 0) {
  13. nums1[len--] = nums2[len2--]
  14. continue
  15. }
  16. nums1[len--] = nums1[len1] >= nums2[len2] ? nums1[len1--] : nums2[len2--]
  17. }
  18. }