【leetcode】合并两个有序数组✚合并两个有序链表

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


1

合并两个有序数组

点击查看题目

在这里插入图片描述

1.使用额外的数组(从前往后)

先创建一个元素个数为m+n的数组tmp,从索引为0开始,判断nums1和nums2数组元素的大小,较小的元素放入数组tmp中,然后较小元素属于的数组索引+1。如示例1中:1<2,将nums1中的1放入tmp数组中。nums1数组的索引+1,即再判断2和2的大小,2==2,将nums1中的2放入tmp数组中。nums1数组的索引+1,即再判断3和2的大小,3>2,将nums2中的2放入tmp数组中。nums2数组的索引+1,即再判断3和5的大小,3<5,将nums1中的3放入tmp数组中。nums1数组的索引+1,此时nums1中没有有效数据了,所以直接将nums2的剩余元素放入tmp数组中

解题思路:创建变量i1和i2,i1是nums1的下标,i2是nums2的下标,当i1<m并且i2<n时,进入while循环,nums1和nums2的元素较小的放在tmp数组中。当i1=m或者i2=n时,退出循环。当i1<m时,将nums1剩余元素直接放在tmp数组中;当i2<n时,将nums2剩余元素直接放在tmp数组中。最后将tmp数组复制给nums1数组

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int *tmp=(int*)malloc(sizeof(int)*(m+n));
    int i1=0;
    int i2=0;
    int i=0;
    while(i1<m && i2<n)
    {
        if(nums1[i1]<=nums2[i2])
        {
            tmp[i++]=nums1[i1++];
        }
        else
        {
            tmp[i++]=nums2[i2++];
        }
    }
    while(i1<m)
    {
        tmp[i++]=nums1[i1++];
    }
    while(i2<n)
    {
        tmp[i++]=nums2[i2++];
    }

    for(int j=0;j<m+n;j++)
    {
        nums1[j]=tmp[j];
    }
}

2.原地合并(从后往前)

上一个方法是先将小的元素放进数组,再放入大的元素。那这个原地合并方法就是将较大的元素先放入最后位置,再找出较大元素放入倒数第二个位置……

解题思路:创建变量i1和i2,i1是nums1最后位置的下标,i2是nums2最后位置的下标,当i1和i2都>=0时,进入while循环,将较大元素从后往前放入nums1数组中。当i1<0或者i2<0时,退出循环。当i1<0即i2>=0时,将nums2的剩余元素按从后往前的顺序放入nums1中;当i2<0即i1>=0时,不用再进行操作

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i1=m-1;
    int i2=n-1;
    int i=m+n-1;
    while(i1>=0&&i2>=0)
    {
        if(nums1[i1]>=nums2[i2])
        {
            nums1[i--]=nums1[i1--];
        }
        else
        {
            nums1[i--]=nums2[i2--];
        }
    }

    while(i2>=0)
    {
        nums1[i--]=nums2[i2--];
    }
    
}

2

合并两个有序链表

点击查看题目

在这里插入图片描述

思路:
思路很简单,就是将逐次比较,较小的放在前面。注意:当两个链表的一个走完后最终链接时,只要将tail->next=不为NULL的链表即可

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if(list1==NULL)
        return list2;
    if(list2==NULL)
        return list1;
    
    //list1和list2都不为NULL
    struct ListNode* i1=list1;
    struct ListNode* i2=list2;
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    while(i1&&i2)
    {
        if(i1->val<=i2->val)
        {
            if(tail==NULL)
            {
                tail=newhead=i1;
            }
            else
            {
                tail->next=i1;
                tail=tail->next;
            }
            i1=i1->next;
        }
        else
        {
            if(tail==NULL)
            {
                tail=newhead=i2;
            }
            else
            {
                tail->next=i2;
                tail=tail->next;
            }
            i2=i2->next;
        }
    }
    if(i1)
        tail->next=i1;
    if(i2)
        tail->next=i2;
    return newhead;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值