leetcode--合并两个有序数组

在这里插入图片描述
思路一:
其实对待多个数组的数据处理问题,最简单粗暴的方法就是新建一个数组,将处理后的数据存放到新开辟的数组中,对待此问题,可以新建一个数组,然后逐个比较数组nums1和nums2中的元素,将小的数存放到新数组中,然后再继续对比。直到将元数组中的元素都存放到新数组中。但是要注意一个问题,就是当一个数组中的元素已经全部都存放到新建的数组中的时候,程序会跳出循环,此时另一个数组中仍然还剩余元素,现在要做的就是将剩下的元素依次存放到新数组中,但是仍然需要注意,问题问的是存放到数组nums1中,所以在程序的最后要将新建的nums中的元素转移到数组nums1当中。
在这里插入图片描述

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int start1=0;
int start2=0;
int start=0;
int* nums=(int*)malloc((m+n)*sizeof(int));
memset(nums,0,(m+n)*sizeof(int));//在函数中另外创建一个数组,不能直接定义数组,利用动态内存管理开辟,并利用memset函数初始化
while(start1<m&&start2<n)
{
    if(nums1[start1]<nums2[start2])
    {
        nums[start++]=nums1[start1++];
    }
    else
    {
        nums[start++]=nums2[start2++];
    }
}
while(start1==m&&start2<n)
{
    nums[start++]=nums2[start2++];
}//当nums1数组中的所有元素都已经放到新数组中,nums2还剩余数据,直接将剩余数据拷贝到新数组
while(start1<m&&start2==n)
{
    nums[start++]=nums1[start1++];
}
for(int j=0;j<m+n;j++)
{
    nums1[j]=nums[j];
}将nums数组中的数据改放到nums1中
}

注意:在一个函数中需要一个新的数组,不能直接定义,而是要通过动态内存管理开辟一块空间,然后通过memset函数初始化,最后记得将新开辟的数组中的数据拷贝到传入的数组中
思路二:
题目中已经说明了数组nums1的空间大小为m+n,因此可以不再开辟新的数组,直接将nums2中的数据存放到数组nums1当中,把较大的数放到后面,因此要从数组的最后开始,若是nums1有效元素中最后的元素比nums2的大,则将该数据放到nums1数组的最后,否则就将nums2有效元素中最后的元素放到nums1数组的最后。
注意:该方法中,当nums2数组中的元素已经全部存放到nums1当中后,表示该过程已结束,但是当nums1中的元素已经全部都移到后面,而nums2中仍然剩余一部分元素,这时就需要把nums2中剩余的元素拷贝到nums1当中

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(end1<0&&end2>=0)
{
    nums1[end]=nums2[end2];
    end--;
    end2--;
}//当nums2中剩余元素,将剩余的元素拷贝到nums1中
}

在这种方法的考虑中,在nums1[end1]>nums2[end2]这个问题的解决时,刚开始时想到的是将nums1[end1]移到nums1[end]的位置,然后剩下的就是nums2[end2]向有序数组中的插入问题,显然这种思路把问题复杂化了,其实在进行赋值之后,eng1–,nums2[end2]自动与下一个元素进行比较,如此则不需要进行插入操作

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值