LeetCode题练习与总结:删除排序链表中的重复元素--83

2024-05-02 17:52

本文主要是介绍LeetCode题练习与总结:删除排序链表中的重复元素--83,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例 1:

输入:head = [1,1,2]
输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

二、解题思路

1. 判断链表是否为空,如果为空,直接返回null。

2. 创建一个哑结点(dummy node),它的next指针指向链表的头节点。哑结点的目的是为了方便删除头节点。

3. 使用两个指针,current和next,分别指向哑结点和哑结点的下一个节点。

4. 遍历链表,比较current的下一个节点和下下个节点的值:

  • 如果它们的值相同,则删除下下个节点。
  • 如果它们的值不同,则将current指向下一个节点。

5. 继续遍历,直到current的下一个节点为空。

6. 返回哑结点的下一个节点,即新链表的头节点。

三、具体代码

class Solution {public ListNode deleteDuplicates(ListNode head) {if (head == null) {return null;}ListNode dummy = new ListNode(0);dummy.next = head;ListNode current = dummy;while (current.next != null && current.next.next != null) {if (current.next.val == current.next.next.val) {current.next = current.next.next;} else {current = current.next;}}return dummy.next;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 我们遍历了整个链表一次,其中 n 是链表的长度。
  • 在每次迭代中,我们进行了常数时间的操作,比如比较节点值和修改节点指向。
  • 因此,总的时间复杂度是 O(n)。
2. 空间复杂度
  • 我们只使用了固定数量的额外空间,即哑结点 dummy 和几个指针变量 current
  • 这些额外空间的使用不依赖于输入链表的大小,因此空间复杂度是 O(1)。

五、总结知识点

1. 链表(Linked List)

  • 链表是一种常见的基础数据结构,由一系列节点组成,每个节点包含数据和一个或多个指向其他节点的引用(链接)。
  • 在这个问题中,我们操作的是单向链表,每个节点只包含数据和指向下一个节点的引用。

2. 哑结点(Dummy Node)

  • 哑结点是一个辅助节点,通常用于简化链表操作,尤其是在处理头节点时。
  • 在这个问题中,哑结点被用来简化删除头节点的操作,因为头节点可能被重复删除。

3. 指针(Pointer)

  • 在链表的操作中,指针用于跟踪当前处理的节点。
  • 在这个问题中,current 指针用于遍历链表,dummy 指针用于简化头节点的删除操作。

4. 循环(Loop)

  • 循环用于遍历链表中的每个节点。
  • 在这个问题中,while 循环用于遍历链表,直到到达链表的末尾。

5. 链表操作

  • 链表的基本操作包括遍历、修改节点数据和修改节点指向。
  • 在这个问题中,我们修改了节点的 next 指针,以删除重复的元素。

6. 条件语句(Conditional Statements)

  • 条件语句用于根据条件执行不同的代码路径。
  • 在这个问题中,if 语句用于检查当前节点的下一个节点和下下个节点的值是否相等,以决定是否删除节点。

7. 算法设计

  • 这个问题涉及到简单的算法设计,即如何高效地删除链表中的重复元素。
  • 通过利用链表的有序性,我们可以通过一次遍历来删除重复元素,这比先排序再删除重复元素更高效。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:删除排序链表中的重复元素--83的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954835

相关文章

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Python实现自动化删除Word文档超链接的实用技巧

《Python实现自动化删除Word文档超链接的实用技巧》在日常工作中,我们经常需要处理各种Word文档,本文将深入探讨如何利用Python,特别是借助一个功能强大的库,高效移除Word文档中的超链接... 目录为什么需要移除Word文档超链接准备工作:环境搭建与库安装核心实现:使用python移除超链接的

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工