欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > leetcode88. 合并两个有序数组,倒着做

leetcode88. 合并两个有序数组,倒着做

2025/2/24 21:50:39 来源:https://blog.csdn.net/qq_51350957/article/details/145221877  浏览:    关键词:leetcode88. 合并两个有序数组,倒着做

leetcode88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
在这里插入图片描述

题目分析

我们需要合并两个有序数组 nums1nums2,其中 nums1 的长度足够容纳 nums1nums2 的所有元素。合并后的数组应该是递减有序的。我们可以从数组的末尾开始合并,这样可以避免覆盖 nums1 中的元素。

总体思维导图

在这里插入图片描述

算法步骤

  1. 初始化三个指针:pos 指向 nums1nums2 合并后的末尾,m 指向 nums1 的末尾,n 指向 nums2 的末尾。
  2. mn 都大于 0 时,执行以下步骤:
    • 如果 n 为 0 或者 nums1[m-1] 大于等于 nums2[n-1],将 nums1[m-1] 放入 nums1[pos],然后 mpos 分别减 1。
    • 否则,将 nums2[n-1] 放入 nums1[pos],然后 npos 分别减 1。
  3. 如果 n 大于 0,将 nums2 中的剩余元素复制到 nums1 的开头。

流程图

算法流程图

开始
初始化指针
m和n是否大于0
比较两个数组的末尾元素
结束
nums1的末尾元素是否大于等于nums2的末尾元素
将nums1的末尾元素放入合并后的位置
将nums2的末尾元素放入合并后的位置
更新指针m和pos
更新指针n和pos
处理剩余数据
结束

具体代码(C++/Go)

class Solution {
public:
//倒着做void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int pos=m+n-1;while(m>0 || n>0){if(n==0||(m!=0 && nums1[m-1]>=nums2[n-1])){nums1[pos]=nums1[m-1];pos--;m--;}else{nums1[pos]=nums2[n-1];pos--;n--;}}}
}; 
func merge(nums1 []int, m int, nums2 []int, n int) {pos := m + n - 1for m > 0 || n > 0 {if n == 0 || (m!= 0 && nums1[m-1] >= nums2[n-1]) {nums1[pos] = nums1[m-1]pos--m--} else {nums1[pos] = nums2[n-1]pos--n--}}
}

算法分析

  • 时间复杂度:O(m + n)
  • 空间复杂度:O(1)
  • 易错点:注意指针的移动和边界条件。
  • 注意事项:确保 nums1 的长度足够容纳 nums1nums2 的所有元素。

相似题目

题目链接
合并两个有序链表https://leetcode.cn/problems/merge-two-sorted-lists/
合并K个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/
间隔合并两个数组https://leetcode.cn/problems/interval-list-intersections/

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词