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

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.hqwc.cn/news/659892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThingsBoard PE专业版解决方案技术文档——温度湿度

1、项目总览 2、设备接入 3、设备告警 3.1 高温告警 创建一个Flag作为标杆,作为开启告警的开关。 3.2 低湿度告警

华为配置mDNS网关示例(AP与AC间二层转发)

华为配置mDNS网关示例&#xff08;AP与AC间二层转发&#xff09; 组网图形 图1 配置mDNS网关组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业的移动终端通过WLAN连接网络&#xff0c;AP_1和AP_2分别与AC之间采用二层转发。部门1和部门2分别属…

《Git---Windows Powershell提交信息中文乱码解决方案》

解释&#xff1a; Windows PowerShell中的Git乱码通常是因为字符编码不正确或Git配置不支持Windows系统的默认编码导致的。Git在处理文件时可能使用UTF-8编码&#xff0c;而Windows系统的命令行工具&#xff08;如PowerShell&#xff09;默认使用的是Windows-1252或GBK编码。 …

夏天一到,手机越用越烫?怎样降低持久使用手机时的温度?

夏季来临&#xff0c;手机的温度也随着使用环境的温度升高变得更容易发热。 虽说属于正常的物理现象&#xff0c;但手机过热用起来还是不太舒服&#xff0c;还容易出现过热提醒&#xff0c;导致除“拨号”和“联系人”外&#xff0c;无法使用其它应用。 分享几个减少功耗的小技…

Aiseesoft Data Recovery for Mac:专业数据恢复软件

Aiseesoft Data Recovery for Mac是一款高效且专业的数据恢复软件&#xff0c;专为Mac用户量身打造。 Aiseesoft Data Recovery for Mac v1.8.22激活版下载 无论是由于误删、格式化还是系统崩溃等原因导致的数据丢失&#xff0c;Aiseesoft都能帮助您快速找回。 它采用先进的扫描…

磁盘格式化文件恢复:一文看懂数据恢复操作

当你意识到关键的硬盘已经被格式化&#xff0c;而且你不能获取里面的内容时&#xff0c;这会是非常令人沮丧的。这种情况可能是因为硬盘被不小心格式化&#xff0c;或者是你在试图修正一些问题、调整文件系统或者释放存储空间时&#xff0c;有意进行的格式化。无论具体情况是什…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

【Java系列】SpringCloudAlibaba 实现在不修改配置文件情况下适配不同环境部署

本文将向大家介绍在SpringCloudAlibaba微服务架构中&#xff0c;如何实现多个微服务在不修改各自配置文件的情况下适配不同环境进行部署。 作者&#xff1a;后端小肥肠 1. 前言 在现代软件开发过程中&#xff0c;随着敏捷开发和持续集成的普及&#xff0c;开发团队越来越需要在…

水下机器人(ROV)中继器(TMS)究竟是个啥?

前段时间公众号后台有人问释放ROV的装置&#xff0c;由于只用过观察级ROV Valor&#xff0c;博主一直以为他说的是绞车&#xff0c;后来才明白他说的是中继器&#xff0c;在水中用来释放、控制和回收ROV的装置。 中继器TMS的全称是缆绳管理系统Tether Management System&#…

深度解析 Spring 源码:从BeanDefinition源码探索Bean的本质

文章目录 一、BeanDefinition 的概述1.1 BeanDefinition 的定位1.2 BeanDefition 的作用 二、BeanDefinition 源码解读2.1 BeanDefinition 接口的主要方法2.2 BeanDefinition 的实现类2.2.1 实现类的区别2.2.2 setBeanClassName()2.2.3 getDependsOn()2.2.4 setScope() 2.3 Bea…

记录浏览器打开网站拦截提示不安全解决方法

浏览器可能会因为多种原因显示“不安全”的警告,这通常是由于安全设置不当或配置错误造成的。以下是一些常见的原因和解决方法: 1. HTTPS未启用 原因:如果网站使用HTTP而不是HTTPS,浏览器可能会显示不安全的警告。 解决方法:配置SSL/TLS证书并使用HTTPS来加密数据传输…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中&#xff0c;人工智能&#xff08;AI&#xff09;作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具&#xff0c;它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…