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

相关文章

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快