【合并两个有序数组】

 题目:

合并两个有序数组的核心思路:归并排序

做题方法: 

1.开辟新空间,对两个数组进行排序

2.开辟一块新的空间,两数组比较 取小的尾插 尾插

3.不额外开辟空间,避免空间复杂度 (本篇详讲)


思路

据题意及示例分析num1的空间足够大 

如左图示:如果从前向后移  可能覆盖前面的值

                                                                                    如左图  从后往前比较存储,避免了覆盖

 

分别定义num1、num2的结束位置 及合并后数组的结束位置

分析: 如果两组数中有一组已结束 则比较结束(剩余数字没得比 无参考) 

  1.  如果num2先结束  num1其余元素保持不动
  2.  若比较后num1先结束  需挪动num2剩下的元素   

代码展示:(根据题分析  直接上代码)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
	int end1 = m - 1; int end2 = n - 1;
	int end = m + n - 1;//下标
	while (end1>=0 && end2>=0)
	{
		if (nums1[end1] < nums2[end2])
		{
			nums1[end] = nums2[end2];
			--end;
			--end2;
		}
		else
		{
			nums1[end] = nums1[end1];
			--end;
			--end1;
		}
	}
	while (end2>=0)
		{
			nums1[end] = nums2[end2];
			--end;
			--end2;
		}
	}

注意:

多画图 !多画图!

  朴实无华的代码提交。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值