题目

图片.png

题解

我的错误,使用从往后的双指针思想,必会导致前面的指针被覆盖,出现错误
正确的思路是,根据nums1的后面数全为0的特性,进行从后向前的遍历

  1. class Solution {
  2. public:
  3. void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
  4. int p1 = m - 1, p2 = n - 1;
  5. int tail = m + n - 1;
  6. int cur;
  7. while (p1 >= 0 || p2 >= 0) { //只要有一个还没遍历完,就不能停止
  8. if (p1 == -1) {
  9. cur = nums2[p2--];
  10. } else if (p2 == -1) {
  11. cur = nums1[p1--];
  12. } else if (nums1[p1] > nums2[p2]) {
  13. cur = nums1[p1--];
  14. } else {
  15. cur = nums2[p2--];
  16. }
  17. nums1[tail--] = cur;
  18. }
  19. }
  20. };