力扣 88题合并两个有序数组 C实现

一开始看到题目的时候不理解什么是非递减顺序排列,于是百度,上面给出的解释是非递减顺序排列即是指:数列递减,但不是单调递减,中间可以有重复。 了解了什么是非递减顺序排列之后便开始构思解题思路。

其中nums1的大小是由nums1目前的元素个数以及nuums2的元素个数相加组成的,nums1中暂时多出来的空间用0表示。C编译给出的函数参数如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)

其中nums1和nums2就是要合并的两个有序数组,后者合并入前者。我的思路很笨,就是依次拿第二个数组的元素与第一个数组里面的元素依次比较,遇到比自己大的元素或者超过了第一个数组组元素的个数之后就将其并入比自己的大的元素前面或者数组末尾。

注意:第一个数组的元素个数m会随着第二个数组元素的不断并入而增大。 

代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    if(n==0)
        return ;
    int *ptr1 = nums1,*ptr2 = nums2,pos1=0,pos2=0,left=m,count=0;
    while(count<n)
    {
        while(*(ptr2+pos2)>*(ptr1+pos1)&&pos1<left)
        {
            pos1++;
        }
        if(pos1>=left)
            *(ptr1+pos1)=*(ptr2+pos2);
        if(*(ptr2+pos2)<=*(ptr1+pos1))
        {
            for(int i=m+count;i>pos1;i--)
            {
                *(ptr1+i)=*(ptr1+i-1);
            }
            *(ptr1+pos1)=*(ptr2+pos2);
        }
        left++;
        pos2++;
        count++;
    }
}

最终结果如下:

欢迎讨论或指正错误~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值