飞道的博客

leetcode--合并两个有序数组

399人阅读  评论(0)


思路一:
其实对待多个数组的数据处理问题,最简单粗暴的方法就是新建一个数组,将处理后的数据存放到新开辟的数组中,对待此问题,可以新建一个数组,然后逐个比较数组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]自动与下一个元素进行比较,如此则不需要进行插入操作


转载:https://blog.csdn.net/qq_52449623/article/details/115524050
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场