题目

描述

  • 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。
  • 编写一个方法,将 B 合并入 A 并排序。
  • 初始化 A 和 B 的元素数量分别为 m 和 n。 ``` 输入: A = [1,2,3,0,0,0], m = 3 B = [2,5,6], n = 3

输出: [1,2,2,3,5,6]

  1. <a name="Ilgdi"></a>
  2. ### 说明
  3. - `A.length == n + m`
  4. <a name="MpM2B"></a>
  5. ## 解答
  6. - 使用三指针法
  7. ```javascript
  8. /**
  9. * @param {number[]} A
  10. * @param {number} m
  11. * @param {number[]} B
  12. * @param {number} n
  13. * @return {void} Do not return anything, modify A in-place instead.
  14. */
  15. var merge = function(A, m, B, n) {
  16. // 三指针法
  17. let cur = m + n - 1; // 指向当前要放的位置
  18. let index1 = m - 1; // 指向A的最后一个位置
  19. let index2 = n - 1; // 指向B的最后一个位置
  20. while(index1 >= 0 && index2 >= 0) {
  21. // 类似「归并排序」思想
  22. // 将A和B的最后一个元素进行比较,较大者放入cur指针所指的位置,并将对应数组指针前移一位
  23. (A[index1] > B[index2]) ? A[cur--] = A[index1--] : A[cur--] = B[index2--];
  24. }
  25. while(index2 >= 0) {
  26. // 如果剩的是A,则已经结束;
  27. // 如果剩的是B,那么还需要将剩余的元素移到A的开头
  28. A[cur--] = B[index2--];
  29. }
  30. };

图解

图片来源:腐烂的橘子

面试题10.01.gif