21.合并两个有序链表

1、题目描述

题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例2:
输入:l1 = [], l2 = []
输出:[]

示例3:
输入:l1 = [], l2 = [0]
输出:[0]

2、解题思路

思路1:
直接遍历比较两个链表的元素值,并使用尾插法将小值插入新链表中。

思路1步骤如下:
1、判断两个链表是否有空链,有空则直接返回非空链表。
2、循环遍历:当两个链表结点都不为空时,比较结点值大小,小值以尾插法插入新链表
3、当有一链表遍历至结尾为空时,将另一链表剩余结点链接到新链表尾部
4、返回新链表

思路2:
使用递归,合并有序链表,具体代码见下方。
题外话:递归的思路借鉴了他人的题解,看到别人的解题思路,不得不感叹,自己就是个小菜鸡,大佬的代码看起来真赏心悦目。

3、代码实现

//思路1代码如下
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    struct ListNode *L ,*r,*s;
    L = (struct ListNode *)malloc(sizeof(struct ListNode));
    L->next = NULL;
    r =L;
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    while(list1 != NULL && list2 != NULL)
    {
        if(list1->val <= list2->val)
        {
            s = (struct ListNode *)malloc(sizeof(struct ListNode));
            s->val = list1->val;
            r->next= s;
            r = s;
            list1 = list1->next; 
        }
        else
        {
            s = (struct ListNode *)malloc(sizeof(struct ListNode));
            s->val = list2->val;
            r->next= s;
            r = s;
            list2 = list2->next;
        }
    }
    while(list1 != NULL)
    {
        s = (struct ListNode *)malloc(sizeof(struct ListNode));
        s->val = list1->val;
        r->next= s;
        r = s;
        list1 = list1->next;
    }
     while(list2 != NULL)
    {
        s = (struct ListNode *)malloc(sizeof(struct ListNode));
        s->val = list2->val;
        r->next= s;
        r = s;
        list2 = list2->next;
    }
    r->next = NULL;
    return L->next;
}
//思路二代码
//(1)自己写的递归代码如下
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    struct ListNode *L;
    L = (struct ListNode *)malloc(sizeof(struct ListNode));
    L->next = NULL;
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
   if(list1->val <= list2->val)
   {
       L->val = list1->val;
       L->next = mergeTwoLists(list1->next,list2);
       return L;
   }else
   {
       L->val = list2->val;
       L->next = mergeTwoLists(list1,list2->next);
       return L;
   }
}


//(2)借鉴递归题解代码如下
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if(list1 == NULL)
        return list2;
    if(list2 == NULL)
        return list1;
   if(list1->val <= list2->val)
   {
       list1->next = mergeTwoLists(list1->next,list2);
       return list1;
   }else
   {
       list2->next = mergeTwoLists(list1,list2->next);
       return list2;
   }
}

4、解题记录

在解决本题时最初的思路就是通过遍历比较值的大小然后合并两个链表,并且由于对于链表知识的遗忘,导致具体实现过程中出现一些错误,且时间花费在复习链表知识上。后来成功提交后,看了题解,才发现可以使用递归解决该题目,并自己尝试着写递归,能成功提交,但占用内存相比官方递归代码多。
第一次提交: 遍历比较值,合并链表,结果如下所示
在这里插入图片描述
第二次提交: 自己写的递归,结果如下
在这里插入图片描述

第三次提交: 官方递归,结果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值