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

news2024/11/18 11:25:14

一、题目描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

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

示例 2:

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

提示:

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

二、解题思路

  1. 创建一个哑结点作为新链表的头部,这样我们就不需要单独处理头结点可能被删除的情况。
  2. 使用两个指针,prev 指针初始化指向哑结点,curr 指针初始化指向链表的头结点。
  3. 遍历链表,如果 curr 指针和 curr.next 指针的值相同,那么就继续移动 curr 指针,直到遇到一个不同的值或者到达链表末尾。
  4. 检查 prev 指针的 next 指针是否等于 curr 指针,如果不等,说明 prev 和 curr 之间有重复元素,将 prev 的 next 指针指向 curr 的 next 指针,这样就跳过了所有重复元素。
  5. 如果 prev 的 next 指针等于 curr 指针,说明没有重复元素,移动 prev 指针到 curr 指针的位置。
  6. 重复步骤3-5,直到 curr 指针为空。
  7. 返回哑结点的 next 指针,这就是删除重复元素后的链表。

三、具体代码

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return null;

        ListNode dummy = new ListNode(0); // 创建哑结点
        ListNode prev = dummy;
        dummy.next = head;

        ListNode curr = head;
        while (curr != null) {
            // 跳过重复元素
            while (curr.next != null && curr.val == curr.next.val) {
                curr = curr.next;
            }
            // 如果prev的next指针和curr不相等,说明有重复元素,跳过这些元素
            if (prev.next != curr) {
                prev.next = curr.next;
            } else {
                // 如果没有重复元素,移动prev指针
                prev = prev.next;
            }
            curr = curr.next;
        }

        return dummy.next;
    }
}

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

1. 时间复杂度
  • 我们遍历了整个链表一次,其中 n 是链表的长度。
  • 在最坏的情况下,每个元素都需要被比较一次,因此时间复杂度是 O(n)。
2. 空间复杂度
  • 我们只使用了几个额外的指针(dummyprevcurr),它们使用的空间是常数级别的。
  • 我们没有使用任何与链表长度成比例的额外空间,因此空间复杂度是 O(1)。

五、总结知识点

  1. 链表操作:链表是线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的引用。代码中涉及了链表的遍历、节点的删除和链表头的调整。

  2. 哑结点(Dummy Node):哑结点是一个附加的节点,通常位于链表的头部,它的值不包含在实际数据中。使用哑结点可以简化链表操作,尤其是在处理链表头部节点的删除时。

  3. 指针的概念:在Java中,我们使用引用来模拟指针的概念。prev 和 curr 是两个指针,分别用于跟踪当前遍历的位置和前一个不重复元素的位置。

  4. 循环结构:代码中使用了while循环来遍历链表。循环结构是控制流的一种,它重复执行一段代码,直到满足某个条件为止。

  5. 条件语句:代码中使用了if-else条件语句来判断是否有重复元素,并根据条件执行不同的代码块。

  6. 链表节点的删除:当发现重复元素时,通过调整指针来跳过这些元素,实现删除操作。这是通过将prev.next指向curr.next来完成的。

  7. 链表的有序性:题目指出链表已经按升序排列,这是解决问题的关键,因为重复的元素在链表中是连续的,这使得我们可以通过比较相邻元素的值来检测重复。

  8. 边界条件的处理:代码中首先检查了链表是否为空,这是一种常见的边界条件处理,确保了代码的鲁棒性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器的通俗讲解:轻松理解容器技术

文章目录 什么是容器&#xff1f;容器与虚拟机的区别容器如何工作&#xff1f;容器的优势容器的应用场景常见容器技术相关解决方案 在当今的软件开发领域&#xff0c;容器技术已经成为一种异常流行的技术&#xff0c;但对于初学者来说&#xff0c;容器究竟是什么以及它们如何工…

Stm32CubeMX 为 stm32mp135d 添加网卡 eth

Stm32CubeMX 为 stm32mp135d 添加网卡 eth 一、启用设备1. eth 设备添加2. eth 引脚配置2. eth 时钟配置 二、 生成代码1. optee 配置2. uboot 配置3. linux 配置 bringup 可参考&#xff1a;Stm32CubeMX 生成设备树 一、启用设备 1. eth 设备添加 我这里只启用一个eth设备&…

容器组_概述

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

Vitis HLS 学习笔记--S_AXILITE 寄存器及驱动

目录 1. 简介 2. S_AXILITE Registers 寄存器详解 2.1 “隐式”优势 2.2 驱动程序文件 2.3 硬件头文件 2.4 硬件头文件中 SC/COR/TOW/COH 的解释 2.5 驱动控制过程 3. 总结 1. 简介 回顾此博文《Vitis HLS 学习笔记--Syn Report解读&#xff08;1&#xff09;-CSDN博…

程序员与土地的关系

目录 一、土地对人类的重要性 二、程序员与土地的关系 二、程序员如何利用GIS技术改变土地管理效率&#xff1f; 四、GIS技术有哪些运用&#xff1f; 五、shapely库计算多边形面积的例子 一、土地对人类的重要性 土地资源对人类是至关重要的。土地是人类赖…

国产操作系统上如何比较软件版本 _ 统信UOS _ 麒麟KOS _ 中科方德

原文链接&#xff1a;国产操作系统上如何比较软件版本 | 统信UOS | 麒麟KOS | 中科方德 Hello&#xff0c;大家好啊&#xff01;在国产操作系统上管理软件版本是确保系统安全性和功能稳定性的关键一环。今天&#xff0c;我将向大家展示如何通过编写脚本在国产操作系统上检查软件…

JAVASE练手项目-ATM

此项目使用到的技术主要是面向对象和JAVA的常用API和ArrayList实现。可以用来做JAVA的基础练手或者是期末作业。 主要功能是&#xff1a;用户开户&#xff0c;登录&#xff0c;存钱&#xff0c;取钱&#xff0c;转账&#xff0c;注销&#xff0c;修改密码。 注&#xff1a;下…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址&#xff1a;https://www.rabbitmq.com/ R…

python 反引号怎么打

切换到英文输入法模式下。 找到电脑键盘 Esc 下面的键。 敲两下就出现反引号了。

在一台交换机上配置VLAN

实验环境 实验拓扑图结构如图12.12所示&#xff0c;其中PC1和PC3属于VLAN 2&#xff0c;PC2属于 VLAN 3&#xff0c;PC1的IP地址为192.168.0.2/24&#xff0c;PC2的IP地址为192.168.1.2/24&#xff0c;PC3的 IP地址为192.168.0.3/24。 图12.12 需求描述 要求处于相同VLAN中的主…

正版Office-Word使用时却提示无网络连接请检查你的网络设置 然后重试

这是购买电脑时自带的已经安装好的word。看纸箱外壳有office标记&#xff0c;但是好像没有印系列号。 某天要使用。提示&#xff1a;无网络连接请检查你的网络设置。 经过网上高手的提示&#xff1a; 说要勾选勾选ssl3.0、TLS1.0、1.1、1.2。 我的截图 我电脑进去就缺1.2. …

【数据结构】串?在计算机中还有这样一种数据结构

串的基本概念与基本操作 导言一、串的定义及其重要术语1.1 串的定义1.2 串的重要术语1.3 ASCII码值1.4 转义字符 二、串的三要素2.1 串的逻辑结构2.2 串的存储结构2.3 串的运算 结语 导言 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 看到今…

手把手实现一个简约酷美美的版权声明模块

1. 导语 版权声明在很多网站都有用到&#xff0c;出场率还是很高的。所以今天就实现一个属于自己分风格的版权声明模块&#xff0c;技术上采用原生的前端三剑客: HTMLCSSJavaScript(可能会用到) 比如CSDN的版权声明是这样的 2. 需求分析 先看看成品吧&#xff0c;这篇文字结…

初始计算机网络

TCP/IP TCP/IP模型 TCP/IP网络模型&#xff1a;对于不同设备之间的通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多种多样的设备&#xff0c;就协商出了一套通用的网络协议。 TCP/IP分层 这个网络协议是分层的&#xff0c;每一层都有…

向gitee推送项目

步骤很详细&#xff0c;直接上教程 在gitee新建项目并复制链接 在当前项目目录打开git bash 输入以下指令进行初始化 git init配置个人信息 git config --global user.name 你的昵称 git config --global user.email 账号绑定的邮箱 5. 绑定远程仓库地址 git remote add ori…

机器人正反向运动学(FK和IK)

绕第一个顶点可以沿Z轴转动&#xff0c;角度用alpha表示 绕第二个点沿X轴转动&#xff0c;角度为Beta 第三个点沿X轴转动&#xff0c;记作gama 这三个点构成姿态&#xff08;pose&#xff09; 我们记第一个点为P0&#xff0c;画出它的本地坐标系&#xff0c;和世界坐标系一样红…

Java面试八股之Java中数组有没有length()方法?String呢?为什么?

Java中数组有没有length()方法&#xff1f;String呢&#xff1f;为什么&#xff1f; 数组&#xff1a; 数组没有名为length()的方法&#xff0c;但有一个属性叫做length。可以通过数组名直接访问这个属性来获取数组的长度&#xff08;即元素个数&#xff09;。这是一个整数值&…

3-2 STM32c8t6实现流水灯

实物接线如下&#xff1a; 软件代码 #include "stm32f10x.h" // Device header #include "delay.h" int main(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_Init…

中国移动首批12个智算中心节点投产暨移动云智算产品体系正式发布

4月28日&#xff0c;中国移动在苏州隆重举办了2024中国移动算力网络大会。其中&#xff0c;以“智算凌云 慧联九州”为主题的一体化算力网络新基建论坛上&#xff0c;中国移动重磅发布了首批12个智算中心节点投产和智算产品体系。 中国移动响应国家号召&#xff0c;依托算力网络…

深度学习之基于YOLOv5智慧交通拥挤预警检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加速和人口规模的不断增长&#xff0c;交通拥挤问题日益严重。传统的交通拥挤预警方…