Leetcode. 88合并两个有序数组

合并两个有序数组

文章目录

  • 归并
    • 思路二

归并

核心思路: 依次比较,取较小值放入新数组中
i 遍历nums1 , j 遍历nums2 ,取较小值放入nums3中
那如果nums[i] 和nums[j]中相等,随便放一个到nums3

Leetcode. 88合并两个有序数组_第1张图片

Leetcode. 88合并两个有序数组_第2张图片

那如果nums[i] 和nums[j]中相等,随便放一个到nums3

Leetcode. 88合并两个有序数组_第3张图片

Leetcode. 88合并两个有序数组_第4张图片

Leetcode. 88合并两个有序数组_第5张图片

此时 nums1 中的元素已经走完了,那么直接把 nums2 中剩下的元素拿到 nums3 中去,
因为nums2 是有序数组 ,所以不需要考虑 nums2剩下的元素比nums3小
Leetcode. 88合并两个有序数组_第6张图片

Leetcode. 88合并两个有序数组_第7张图片

这总方法最大的问题就是新开辟了一个数组 如果题目要求空间复杂度为O(1) ,这种方法就不管用了

思路二

归并依次比较取较小值 ,但是思路二是依次比较取较大值
思路二和归并大体上相似 ,

思路二整体思路:
i 指向nums1最后一个有效元素 ,向前遍历 ,
j 指向nums2最后一个有效元素 ,向前遍历
dst指向nums1 的最后一个元素 ,也是向前遍历
j 指向的元素如果大于 i 指向的元素,那么就把 j 指向的元素放入 dst 指向的位置中去

Leetcode. 88合并两个有序数组_第8张图片

Leetcode. 88合并两个有序数组_第9张图片
Leetcode. 88合并两个有序数组_第10张图片

Leetcode. 88合并两个有序数组_第11张图片
Leetcode. 88合并两个有序数组_第12张图片

当j 向前遍历完nums2时 ,我们直接让它结束就行了

但是还需要多考虑一种情况

Leetcode. 88合并两个有序数组_第13张图片

当nums1中的每一个元素都比nums2中的每一个元素大 ,nums1 一定会先遍历完 ,这时候就需要将nums2 的每一个元素提前放入nums1中
Leetcode. 88合并两个有序数组_第14张图片

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
  int i = m -1 ;
  int j = n- 1 ;
  int dst = m + n -1 ;
  while( i >=0 && j >= 0)
  {
      //nums2先走完 , j < 0 
      if( nums1[i]>= nums2[j])  //取较大值
      {
          nums1[dst] = nums1[i];
          dst-- ;
          i--;
      }
      else
      {
          nums1[dst]=nums2[j];
          dst--;
          j--;
      }
  }
    // nums1 先走完 , i < 0 
    while( j>=0 )
    {
        nums1[dst] = nums2[j];
      j -- ;
      dst -- ;
    }
}

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

你可能感兴趣的:(leetcode,算法,数据结构)