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

news/2024/5/19 18:54:55

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.mrgr.cn/p/62767602

相关文章

uniapp开发小程序引入vant

1. 安装 # 通过 npm 安装 npm i @vant/weapp -S --production# 通过 yarn 安装 yarn add @vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production2. 引入项目首先在项目根目录创建文件夹 wxcomponents ,然后在其中创建 vant 文件夹。 把node_modules中的v…

Redis高级-分布式缓存

分布式缓存 – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xf…

QT作业1

1、思维导图 2、 自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 头文件&#xff1a; #ifndef MUSIC1_H #define MUSIC1_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QIcon>…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

【LeetCode刷题记录】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,1…

Reflection: Cast IEnumerableT to runtime type

https://stackoverflow.com/questions/44546513/cast-ienumerablet-to-runtime-type 本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/keeplearningandsharing/p/18176925

Windows 10 LTSC启用Microsoft Store的方法

新建msreg.bat文件,并编辑内容如下: ========== @echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\sys…

瑞芯微RK3588 MIPI CSI接6路imx464驱动

瑞芯微RK3588最高支持6路mipi camera&#xff0c;此篇分享下如何接入6路imx464 我们使用2 MIPI DCPHY 4 MIPI CSI DPHY(2 lanes)这个配置。 首先就是dts配置 // SPDX-License-Identifier: (GPL-2.0 OR MIT) /** Copyright (c) 2021 Rockchip Electronics Co., Ltd.**/&c…

vue2实现右键菜单功能——vue-diy-rightmenu——基础积累

五一之前遇到一个需求&#xff0c;就是关于要实现自定义右键菜单的功能&#xff0c;普通的右键展示的菜单有【返回/前进/重新加载/另存为】等&#xff0c;希望实现的效果就是右键出现自定义的菜单&#xff0c;比如【编辑/删除/新增】等。 遇到这种的需求&#xff0c;可以直接去…

(done) LSTM 详解 (包括它为什么能缓解梯度消失)

RNN 参考视频&#xff1a;https://www.bilibili.com/video/BV1e5411K7oW/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 LSTM 参考视频&#xff1a;https://www.bilibili.com/video/BV1qM4y1M7Nv?p5&vd_source7a1a0bc74158c6993c7355c5…

Pytorch入门—Tensors张量的学习

pytorch入门Tensors张量的学习记录。Tensors张量的学习 张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量来编码模型的输入和输出,以及模型的参数。 张量类似于NumPy的ndarrays,只是张量可以在GPU或其他硬件加速器上运行。事实上,张量和NumPy数组…

sql 存储过程proc中的参数 是 @details 表值 参数类型的时候,如何如何查看 自定义表的 表结构和字段信息

if 数据库工具 是 sqlserver2008 R2 去安装一个 sql prompt 就行了,鼠标放上去会自动提示 表结构信息 else

Java特性之设计模式【享元模式】

一、享元模式 概述 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式 享元模式尝试重用现有的同类对…

RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术

RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术 在大模型爆发的时代,快速准确地从大量数据中检索出有价值的信息变得至关重要。检索增强生成(RAG)技术,结合了传统的信息检索和最新的大…

《Decoupled Contrastive Learning for Long-Tailed Recognition》阅读笔记

论文标题 《Decoupled Contrastive Learning for Long-Tailed Recognition》 针对长尾识别的解耦对比学习 作者 Shiyu Xuan 和 Shiliang Zhang 来自北京大学计算机学院多媒体信息处理国家重点实验室 初读 摘要监督对比损失(Supervised Contrastive Loss, SCL)监督对比损失在视…

电脑录屏什么软件好?网友力荐的3款软件!

随着电脑的使用越来越广泛&#xff0c;电脑录屏软件也成为了人们日常生活中经常需要使用到的工具。无论是录制游戏画面、教程演示还是远程教育&#xff0c;一款优秀的电脑录屏软件都能为用户提供极大的帮助&#xff0c;可是电脑录屏什么软件好呢&#xff1f;本文将为大家介绍3款…

鸿蒙OS NEXT的推出,目标是更广阔的智能设备市场

Hybird App开发技术(尤其是小程序+原生技术)为鸿蒙应用开发带来了诸多利好,它不仅可以帮助开发者快速开发高质量的应用,还可以降低开发成本,提高开发效率。可能有一些中大型企业的开发同学会问,那还是没有解决已有的App鸿蒙化。换位思考,其实是优先级的问题,如果现在留…

hadoop学习---基于Hive的数仓搭建增量信息拉链表的实现

拉链表就是SCD2&#xff0c;它的优点是即满足了反应数据的历史状态&#xff0c;又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段&#xff1a; start_time(表示该条记录的生命周期开始时间——周期快照时的状态)end_time(该条记录的生命周期结束时…

数据库原理与应用实验三 嵌套查询

实验目的和要求 加深和掌握对嵌套查询的理解和应用 实验环境 Windows10 SQLServer 实验内容与过程 图书&#xff08;书号&#xff0c;书名&#xff0c;价格&#xff0c;出版社&#xff09; 读者&#xff08;卡号&#xff0c;姓名&#xff0c;年龄&#xff0c;所属单位&a…

交互式应用安全测试(Interactive application security testing IAST)

交互式应用安全测试(Interactive application security testing IAST)一、IAST介绍 交互式应用安全测试(Interactive application security testing IAST)是一个在应用和API中自动化识别和诊断软件漏洞的技术。如果从名字的缩写来看,插桩(Instrumented)式应用安全测试或…