【力扣习题笔记】合并两个有序链表

该博客详细介绍了如何使用哨兵节点实现两个已排序链表的合并。通过创建一个虚拟头结点guard并设置两个指针cur1和cur2分别遍历list1和list2,根据节点值大小进行尾插操作。在循环结束后处理可能存在的剩余链表,并返回新链表的头结点。该算法确保了合并后的链表依然有序。
摘要由CSDN通过智能技术生成

题目描述

在这里插入图片描述
在这里插入图片描述

思路

利用哨兵头结点,用两个指针cur1,cur2指向list1,list2比较,val值小的,拿下来尾插到guard的后面,用一个指针tail用来记录尾。
注意:记得malloc一个哨兵头结点
分析情况:
1.当有一个链表为空,那么那那个不为空的链表直接尾插到guard后面就好。
2.如果,两个链表都为空,那么返回空。(把guard->next值初始化为空,最后返回,或者最后将tail->next置为空。
3.两个练表都不为空,比较大小,会有一个链表先走完,会有一个剩余,当一个先走完了就结束,后续在进行判断,把不为空的那个链表的剩余直接尾插到tail后面。

在这里插入图片描述

代码

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* cur1=list1;
    struct ListNode* cur2=list2;

    struct ListNode* guard=(struct ListNode*)malloc(sizeof(struct ListNode));
    guard->next=NULL;
    struct ListNode* tail=guard;
    //cur1,cur2有一个结束了,就是有一个指向空了,就退出循环
    while(cur1&&cur2)
    {
        if(cur1->val < cur2->val)
        {
            //尾插到tail的后面
            tail->next=cur1;
            //更新cur1
            cur1=cur1->next;
        }
        else
        {
            tail->next=cur2;
            cur2=cur2->next;
        }
        tail=tail->next;//更新tail

    }
    //有一个可能会有剩余,直接尾插,因为本身就是升序
    if(cur1!=NULL)
    {
      tail->next=cur1;
    }
    if(cur2!=NULL)
    {
        tail->next=cur2;
    }
    //返回guard的下一个,即新的头
    return guard->next;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值