Ieetcode——21.合并两个有序链表

news2025/1/13 15:34:51

21. 合并两个有序链表 - 力扣(LeetCode)

合并两个有序链表我们的思路是创建一个新链表,然后遍历已知的两个有序链表,并比较其节点的val值,将小的尾插到新链表中,然后继续遍历,直到将该两个链表的全部节点全部尾插到新链表中。下面我来画图分析一下如何进行遍历和尾插:

遍历和尾插的过程就如上图一般,接下来我们来实现代码。

我们在写代码的时候还应该注意一些特殊情况:有序链表为空的情况。 

我们看,对于这两种情况下:如果两个有序链表都为空,那么就返回NULL;如果只有一个为空,那就返回另外一个。 

分析到这里,我们就可以开始写代码了。(注意:该代码只包含解决该问题的函数部分,不包含主函数内容)

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    //有空链表
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    //无空链表
    //创建新链表,遍历两链表
    ListNode* newlist = NULL;
    ListNode* newtail = NULL;

    while(list1 && list2)//这两个链表只要有一个走到了NULL,就说明为NULL的链表已经全部尾插完了
    {
        if(list1->val <= list2->val)
        {
            if(newlist == NULL)
            {
                //新链表为空
                newlist = list1;
                newtail = list2;
            }
            else
            {
                //新链表不为空
                newtail->next = list1;
                newtail = newtail->next;
            }
            //尾插完后,遍历下一个节点
            list1 = list1->next;
        }
        else
        {
            if(newlist == NULL)
            {
                //新链表为空
                newlist = list1;
                newtail = list2;
            }
            else
            {
                //新链表不为空
                newtail->next = list1;
                newtail = newtail->next;
            }
            //尾插完后遍历下一个节点
            list2 = list2->next;
        }
    }
    //跳出循环,说明有一个链表已经遍历完了,只需将另一个链表的剩余元素尾插到新链表
    if(list1 == NULL)
    {
        //list1遍历完了,将list2尾插到新链表中
        newtail->next = list2;
    }
    else
    {
        //list2遍历完了,将list1尾插到新链表中
        newtail->next = list1;
    }
    return newlist;
}

我们写完之后,代码虽然可以成功解决问题,但是其中出现了很多重复的代码。 

哨兵位是一个有空间但是没有值的节点,而且是动态开辟的内存空间,所以我们现在就不能直接返回newist了,而是返回newlist->next,但是动态开辟的内存空间我们使用完之后就应该释放掉,所以我们应该先创建一个临时变量将newist->next存起来,然后将newlist释放掉,后返回临时变量。

所以我们要对该代码进行两部分的调整:

部分一:用来解决重复代码

部分二:用来解决动态内存开辟的释放以及哨兵位的引入对返回值的影响 

下面附上完整代码:

typedef struct ListNode ListNode;//避免因为类型名长而对其进行重命名
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    //有空链表
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    //无空链表
    //创建新链表,遍历两链表
    ListNode* newlist = (ListNode*)malloc(sizeof(ListNode));
    ListNode* newtail = newlist;

    while(list1 && list2)//这两个链表只要有一个走到了NULL,就说明为NULL的链表已经全部尾插完了
    {
        if(list1->val <= list2->val)
        {
            newtail->next = list1;
            newtail = newtail->next;
            //尾插完后,遍历下一个节点
            list1 = list1->next;
        }
        else
        {
            newtail ->next = list2;
            newtail = newtail->next;
            //尾插完后遍历下一个节点
            list2 = list2->next;
        }
    }
    //跳出循环,说明有一个链表已经遍历完了,只需将另一个链表的剩余元素尾插到新链表
    if(list1 == NULL)
    {
        //list1遍历完了,将list2尾插到新链表中
        newtail->next = list2;
    }
    else
    {
        //list2遍历完了,将list1尾插到新链表中
        newtail->next = list1;
    }
    ListNode* ret = newlist->next;
    free(newlist);
    newlist = NULL;
    return ret;
}

 完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

请求路径引发的http308错误

记录一个请求路径输错引发的问题。 正确路径&#xff1a; /user/bind-email 请求路径我们如果输错故意多打一个s /user/bind-emails 正常预检请求会报错404未找到&#xff0c;我们下意识的就去排查路径是不是写错了 但是如果多打一个/ /user//bind-email 此时预检请求会报308永…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

做国外数据采集,更改ip后还被封是ip质量的原因吗?

IP质量低确实会出现封锁情况&#xff0c;但不是唯一的因素。 高质量的IP地址通常不容易被锁定&#xff0c;因为他们往往是由正规的ISP&#xff08;互联网服务商&#xff09;。但是&#xff0c;即使是高质量的IP地址&#xff0c;也有可能受其他因素影响导致封锁&#xff0c;如滥…

详解封装,继承,多态

java是一种面向对象的编程语言。 面向对象&#xff1a;是把构成问题的事务分解成各个对象&#xff0c;而建立对象的目的也不是为了完成一个个步骤&#xff0c;而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性&#xff0c;所以易维…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…

【论文阅读】ChipNeMo中的领域适配检索模型

前面先总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》。然后发现文章中还有细节需要继续学习&#xff0c;前一篇看了领域适配分词&#xff0c;今天接着看领域数据微调的预训练检索模型。 领域适配检索模型 众所周知&#xff0c;LLM 可以生成不准确的文本&…

DVWA靶场

DVWA是指Damn Vulnerable Web Application&#xff0c;是一个用于教育和训练网络安全人员的虚拟漏洞应用程序。DVWA模拟了一个包含了多种常见Web安全漏洞的虚拟环境&#xff0c;包括SQL注入、XSS攻击、CSRF攻击等等。通过使用DVWA&#xff0c;安全人员可以学习和实践各种Web安全…

科研学习|论文解读——CVPR 2021 人脸造假检测(论文合集)

随着图像合成技术的成熟&#xff0c;利用一张人脸照片合成假视频/不良视频现象越来越多&#xff0c;严重侵犯个人隐私、妨碍司法公正&#xff0c;所以人脸造假检测越来越重要&#xff0c;学术界的论文也越来越多。 一、研究1 1.1 论文题目 Multi-attentional Deepfake Detecti…

从零开始构建大语言模型(MEAP)

原文&#xff1a;annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型&#xff08;LLM&#xff09;背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

第二证券投资参考:汽车以旧换新细则发布 云厂商AI投资持续加码

上星期五&#xff0c;A股放量大涨。两市股指盘中单边上行&#xff0c;午后再度攀升&#xff0c;沪指涨超1%&#xff0c;创业板指大涨超3%&#xff1b;到收盘&#xff0c;沪指涨1.17%报3088.64点&#xff0c;深证成指涨2.15%报9463.91点&#xff1b;创业板指涨3.34%报1823.74点&…

git 的迁移

现象是gitlab经常会挂掉&#xff0c;linux会显示磁盘空间不足&#xff0c;实际上&#xff0c;我们linux某个目录的空间是4T。这个空间应该是足够的。猜测是gitlab的安装目录不对导致的空间不足。 1、查找原因 用rpm 安装gitlab会有自己的目录&#xff0c;很多安装文件会在opt…

当非遗遇上全身动作捕捉设备,创新非遗文化传承形式

随着全身动作捕捉设备不断革新&#xff0c;越来越多行业运用全身动作捕捉设备保护并传承非遗文化&#xff0c;如越剧、戏曲、武术等非遗项目&#xff0c;可以通过全身动作捕捉设备实时动态采集非遗演绎数据&#xff0c;搭建非遗数据框架&#xff0c;使传统戏剧、游艺与杂技等多…

【收藏全开源】JAVA智慧社区系统粉丝生活同款系统支持跑腿家政本地生活上门服务商城支持微信小程序+微信公众号+H5+APP_博纳软云

JAVA智慧社区系统&#xff1a;打造一站式本地生活服务新体验 在现代快节奏的生活中&#xff0c;社区服务的便捷性愈发受到重视。我们倾心打造的JAVA智慧社区系统&#xff0c;正是为了满足居民对高效、便捷社区服务的期待。该系统不仅融合了粉丝生活同款系统的优秀元素&#xf…

今年做电商,视频号小店可以冲一下,这次腾讯不负所望站在了风口

腾讯做电商&#xff0c;能不能搞&#xff1f; 对于腾讯做电商这件事&#xff0c;很多玩家并不看好&#xff0c;毕竟腾讯想做的东西太多了&#xff0c;做电商这件事也曾失败过&#xff1b; 但是这次&#xff0c;无论是电商老玩家还是新手玩家&#xff0c;腾讯推出的视频号小店…

AI智能体崛起:未来挑战与机遇解析

随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中的一部分。而在众多AI应用中&#xff0c;Agent AI智能体因其高度的自主性、交互性和智能化水平&#xff0c;被广泛应用于各种场景。在未来社会中&#xff0c;Agent AI智能体的角色将会如何定位…

Java 写一个死锁的例子

public class DeadLock {public static void main(String[] args) {Object lock1 new Object();Object lock2 new Object();new Thread(new A(lock1,lock2),"线程A").start();new Thread(new B(lock1,lock2),"线程B").start();} }class A implements Run…

【探索Linux】P.33(HTTP协议)

阅读导航 引言一、认识URL二、URL编码和解码1. Urlencode&#xff08;URL编码&#xff09;2. Urldecode&#xff08;URL解码&#xff09; 三、HTTP的方法四、HTTP的状态码五、HTTP常见Header六、最简单的HTTP服务器温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了“自…

【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点

1、帧类型 CAN (Controller Area Network) 帧格式是为了高效、可靠地在多个节点间传输数据而设计的。CAN 帧有几种类型,包括数据帧(标准帧和扩展帧)、远程帧、错误帧和过载帧,其中数据帧和远程帧是最常用的。 2、数据帧 数据帧包括:标准帧和扩展帧。 两者的主要区别: …

solidworks出现slderrresu.dll错误如何解决?亲测有效

通过近来给客户安装SolidWorks发现&#xff0c;SolidWorks2010、SolidWorks2012、SolidWorks2014、SolidWorks2015、SolidWorks2016、SolidWorks2017都会出现这个slderrresu.dll安装错误问题&#xff1a; 其实这个错误很好解决,主要是因為安裝中文版solidworks沒有選擇安裝中文…