单链表经典OJ题:合并有序链表

目录

​编辑

题目:

图例:

分析:

解法:

解法1:

解法2:

解法的对比:

解法2:

注意事项:

图例: 

代码演示:

代码分析:

代码缺点:

重复代码带来的问题比较多的:

缺点分析:

优化: 

注意事项:


 

题目:

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

图例:

分析:

如上图所示,本质其实就是比较节点和节点直接的大小,然后进行排序,小的在前,大的在后,需要使用插入节点的方法。

解法:

解法1:

  • 在原链表基础上进行修改,会使用到在指定位置之前插入数据。

解法2:

  • 创建一个新的空链表,遍历两个链表,进行新链表的尾插。

链表——单链表的简单介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2301_76445610/article/details/133811446?spm=1001.2014.3001.5501

解法的对比:

  • 无论是解法1和解法2都离不开本质,但不同的是解法1需要的插入方式有些麻烦,因为需要用到指定位置插入节点。
  • 而解法2则是在比较完后,小的节点直接修改方向,指向新的链表中,用到的是尾插,相比指定位置插入数据少了一步。
  • 对此我们使用解法2。

解法2:

  1. 分别定义两个指针指向两个链表的头节点,然后开始进行遍历比较,比较结果小的放到新链表中。
  2. 然后在使用两个指针当作新链表的头指针和尾指针,一开始两个指针是相同的,但伴随着比较后第一个节点的到来,尾指针开始进行挪动,头指针不变动。

 

注意事项:

  • 注意,要先判断两个需要比较合并的链表是否为空,当某一方链表遍历结束,则停止比较,然后把没停的那一个全部按顺序尾插到新链表中。

 

图例: 

 

  • 谁指向的数值小,谁的指针移动 。

 

代码演示:

 

    

代码分析:

  • 如果cur1指向的数值小于cur2指向的数值,则cur1指向的数值所存在的节点进行尾插,尾插到新链表中 ,且cur1这个指针挪到下一个节点位置。
  • 反之也是如此。
  • 且因为是有序的链表,当某一个链表走完后,另一个链表还剩着,那么直接将新链表最后一个节点的指向改成剩下的旧链表中的最前面一个节点
  • 基于链表的特征,一个节点内存储着下一个节点的地址,所以只要把剩下的旧链表中的最前面节点交给新链表最后一个节点内部的指针(newTail->next)
  • 因此还需要判断cur1和cur2是否为空。

 

代码缺点:

需要考虑信链表的头结点为空或者非空,所以导致这里的重复代码比较多

重复代码带来的问题比较多的:

  1. 降低程序员的开发效率
  2. 代码的可读性非常差
  3. 代码的维护性非常差 

缺点分析:

  • 解决当前代码问题的关键是消除判断链表的第一个节点是否存在。
  • 也就是第一个节点必须要确保存在且无需判断,所以这里使用带头的单链表。
  • 而带头的单链表自带一个节点。
  • 但这个节点中的数据是不可使用不可更改的。
  • 所以我们直接创建一个带头的单链表作为接收比较之后内部数据较小的节点。

优化: 

使用开辟空间将代码变成带头的单链表

  • 判断第一个节点是否存在的原因是为了定位链表,而定位链表就是从第一个节点开始的,而带头链表自带第一个节点。

注意事项:

  • 注意这里可以不判断malloc是否开辟成功。

     

  •  原先判断新链表是否是空和非空状态消失了。
  • 因为一开始就是非空的存在,所以不需要使用newHead = newTail = cur2;和newHead = newTail = cur1;进行定位,直接一开始两个指针就指向新链表第二个节点的位置。(带头的第一个节点是不能存储数据的)

  • 同时,我们也要注意,最后返回的时候,需要从链表的第二个位置开始返回,因为带头链表的第一个节点是没有数据存在的。
  • 但是我们怕释放后找不到第二个节点,于是我们先用临时遍历来存储第二个节点的地址,在把头节点进行释放。

                                                       

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

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

相关文章

[MySQL]BLOB/TEXT column ‘xxx‘ used in key specification without a key length

报错信息: SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column xxx used in key specification without a key length 原因: MySQL的唯一索引不支持text类型的字段!

C++初阶-类和对象(上)

类和对象(上) 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装访问限定符封装 五、类的作用域六、类的实例化七、类的对象大小的计算如何计算类对象的大小类对象的存储方式猜测 八、类成员函数的this指针this指针的引出…

网站如何才能不被黑,如何做好网络安全

当企业网站受到攻击时,首页文件可能被篡改,百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而,许多企业缺乏建立完善的网站安全防护体系的知识。因此,需要专业的网站安全公司来提供相应的保护措施。今…

番外8.1 配置+管理文件系统

Task01: Linux 文件系统结构; 可以进行Linux操作系统的文件权限管理与方式切换,可以应用磁盘与文件权限管理工具; 01:常见文件系统类型(Ext4[rhel6默认文件管理系统], 存储容量1 EB1073741824 GB; XFS[rhel 7/8默认的文…

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP(One-Time Password)是一种用于身份验证的协议,它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录,以下是一些实现步骤: 1、安装Radius服务器 首先需要安装Radius服务器…

【量化交易笔记】9.量化投资理论及一般流程

前言 在第7篇文章中指出,量化交易的主要有两方面应用,基于的数据主要是两个类型,如前面讲的用之前的数据预测股价,这类数据我们可归为纵向研究数据,又称时间序列数据,另一类是横截面数据,以称截…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接:武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链: • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

Android MediaMetadataRetriever setDataSource failed: status = 0xFFFFFFEA

Android MediaMetadataRetriever setDataSource抛错: java.lang.RuntimeException: setDataSource failed: status 0xFFFFFFEA 原因是 setDataSource(String path) path指向的视频文件大小为0或者是破损视频资源。 Android AppGlideModule,DataFetcher,ModelLoad…

环境变量【使用命令行参数引出环境变量】

前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…

Spring 国际化:i18n

文章目录 i18n概述Java国际化Spring6国际化MessageSource接口使用Spring6国际化 i18n概述 国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户&…

Apacheb Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437) 1 在线漏洞解读: https://vulhub.org/#/environments/shiro/CVE-2016-4437/2 环境搭建 cd /home/kali/vulhub/shiro/CVE-2016-4437启动: sudo docker-compose up -d # 拉取下载并启动sud…

PyQt 小程序

设备管理程序 v0.0.1.0, 终于出了一个基础版本,… … 两个字典的键值判断 辛亏用的是Python 这个编码时间大大缩短了 对已有的命令行进行GUI 化 from typing import Optional import PySide6.QtCore import PySide6.QtWidgets from cmd_ui import Ui_MainWindow from PySide6.…

亚马逊测评关于IP和DNS的问题

最近不少人询问了关于IP和DNS的问题,在此进行一些科普。 当客户端试图访问一个网站时,首先会向其所在的ISP的DNS服务器进行查询。如果ISP的DNS服务器没有相关缓存,则会向上级DNS服务器进行查询。 一些诸如CDN之类的服务,可能会为…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud(插件市场) DCloud 是uni-app官方插件市场,里面有官方、团队、个人发布的众多插件,包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考,但一些团队或个人发布的小型插件没有文档&#xf…

STM32-LCD液晶显示

LCD液晶显示 针对野火指南者配套资料:3.2寸 LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,该控制器芯片中存在GRAM(即显存)。该液晶控制器使用8080接口与单片机通讯,液晶面板引出来的FPC信号线为8080接口&am…

LeetCode算法刷题(python) Day42|09动态规划|62.不同路径、63. 不同路径 II

目录 LeetCode 62. 不同路径LeetCode 63. 不同路径II LeetCode 62. 不同路径 力扣题目链接 class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[1] * n for _ in range(m)]for j in range(n):for i in range(m):if i 0 and j > 0:dp[i][j] dp[i][j-1…

【vue2高德地图api】02-npm引入插件,在页面中展示效果

系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、安装高德地图二、在main.js中配置需要配置2个key值以及1个密钥 三、在页面中使用3.1 新建路由3.2新建vue页面3.2-1 index.vue3.2…

css 好看的边框

1、把图片作为边框 border:10px solid transparent;border-image:url(./assets/images/login_bg.png) 30 round;2、斜线边框 斜线边框可以给页面元素增加一份生动感。可以使用linear-gradient()函数来设置。 .box{position:relative;border-top:4px solid #667db6;border-bot…

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合(Link Aggregation)是将多条物理链路捆绑在一起成为一条逻辑链路,从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …

QTday02(常用类、UI界面下的开发、信号与槽)

今日任务 1. 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin"&#x…