顺序表——合并两个有序数组

首先,我们来看一下题目。

方法一:

根据我们之前所学的排序算法,我们可以很容易的想出第一个解决方法就是,先将nums2中的数据先依次插入nums1中,再利用冒泡排序将数据进行排序。这个方法很容易想出来,但是冒泡排序是利用两个for循环来进行排序,可以实现但是耗费时间多,且重复的操作多。

方法二:

                                                             l1                                                     l3

123000

                                                                                                 l2

256

我们可以应用一种类似于比较大小然后从后往前依次覆盖的思想。因为nums1与nums2两个数组都是从小到大进行排列的,所以我们创建两个指针,分别放在两个数组中有效数字的最后一位。我们先比较l1与l2的大小,如果l1大那我们就将l1的值赋值给l3,然后再将l1减一,反之,就将值赋值给l3,再将l2减一。那么就可以知道,第一个循环进行的条件就是l1和l2必须都大于等于零。第二个循环进行的条件就是l2一定要大于等于零,当l2遍历完成而l1没有遍历完成时,结果没有影响。但是当l1遍历完成而l2没有遍历完成时,就会导致缺少数据。所以当l2大于等于零的时候,我们要将l2的值依次赋值给l3直到l2小于零。

#include<stdio.h>

void merge(int* nums1, int* nums2, int m, int n)
{
	int l1 = m - 1;
	int l2 = n - 1;
	int l3 = m + n - 1;

	while (l1 >= 0 && l2 >= 0)
	{
		if (l1 > l2)
		{
			nums1[l3] = nums1[l1];
			l3--;
			l1--;
		}
		else
		{
			nums1[l3] = nums2[l2];
			l3--;
			l2--;
		}
	}
	while (l2 >= 0)
	{
		nums1[l3] = nums2[l2];
		l3--;
		l2--;
	}
}

int main()
{
	int nums1[] = { 1,2,3,0,0,0 };
	int nums2[] = { 4,5,6 };
	int m = 6;
	int n = 3;
	merge(nums1, nums2, m, n);
	return 0;
}

大家有兴趣的话可以自行去力扣尝试一下哦,链接已经粘贴在下面了。

. - 力扣(LeetCode)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值