【Py/Java/C++三种语言详解】LeetCode每日一题240115【链表】LeetCode82、删除排序链表中的重复节点II

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码
    • python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目链接

LeetCode82、删除排序链表中的重复节点II

题目描述

给定一个已排序的链表的头 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
  • 题目数据保证链表已经按升序 排列

解题思路

相比起前一题LeetCode83、删除排序链表中的重复节点,本题的区别在于要删除掉所有出现重复的节点

即假设存在链表1->2->2->2,那么值为1的节点应该作为当前节点cur,才能够顺利删除掉后面的所有值为2的节点。

同理,由于原链表的头节点可能被删除,所以本题需要设置哑节点dummyHead指向头节点,且当前节点cur初始化为哑节点,往后遍历

dummyHead = ListNode(0, head)   # 由于头节点可能被删除,设置哑节点指向头节点
cur = dummyHead                 # 当前节点cur从哑节点开始

由于需要判断下下个节点和下个节点的值是否相等,因此循环迭代的while条件为cur下下个节点存在,即

while(cur.next.next):
    pass

若当前节点cur的下个节点cur.next和下下个节点cur.next.next的值相等,则需要删除下下个节点,即

while(cur.next.next):           
    if cur.next.val == cur.next.next.val:
        cur.next = cur.next.next
    pass

由于下个节点cur.next也是被需要删除的节点,但是还不能在现在立刻删除,因为可能后面还存在第三个、第四个等值的节点需要删除,所以可以先用一个标记del_next_flag来标记,表示cur.next待会儿需要被删除。

while(cur.next.next):           
    if cur.next.val == cur.next.next.val:
        cur.next = cur.next.next
        del_next_flag = True
    pass

若当前节点cur的下个节点cur.next和下下个节点cur.next.next的值不相等,则需要考虑del_next_flag的值。若del_next_flag

  • True。说明cur.next是需要被删除的节点,删除之,且重置del_next_flag = False
  • False。说明cur.next不用被删除,cur可以前进到cur.next的位置。

综上整个while循环的过程为

while(cur.next.next):           
    if cur.next.val == cur.next.next.val:
        cur.next = cur.next.next
        del_next_flag = True
    else:
        if del_next_flag:
            cur.next = cur.next.next    
            del_next_flag = False
        else:
            cur = cur.next

注意在退出循环后,还需要再检查一次del_next_flag的值,以判断最后的尾节点是否需要删除。即

if del_next_flag:
    cur.next = cur.next.next 

最后返回哑节点的下一个节点,即为所有删除操作完毕之后的链表头节点。

代码

python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None:                # 排除特殊情况
            return None
        dummyHead = ListNode(0, head)   # 由于头节点可能被删除,设置哑节点指向头节点
        cur = dummyHead                 # 初始化当前节点为哑节点
        del_next_flag = False           # bool型标记,表示下一个节点cur.next是否需要删除
        while(cur.next.next):           # 循环迭代所有节点
            # 如果下一个节点的值等于下下个节点
            if cur.next.val == cur.next.next.val:
                # 删去下下个节点,将del_next_flag标记为True,用于后续删除下个节点
                cur.next = cur.next.next
                del_next_flag = True
            else:
                # 如果del_next_flag是True,说明下个节点也属于重复节点之一,需要删除
                # 删除后重置del_next_flag为False
                if del_next_flag:
                    cur.next = cur.next.next    
                    del_next_flag = False
                # 如果下个节点和下下个节点的值不等,且del_next_flag为False,
                # 则cur才可以前进
                else:
                    cur = cur.next
        # 退出循环后,如果del_next_flag为True,还需要再删去尾节点
        if del_next_flag:
            cur.next = cur.next.next  
        return dummyHead.next

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }

        ListNode dummyHead = new ListNode(0, head);
        ListNode cur = dummyHead;
        boolean delNextFlag = false;

        while (cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                cur.next = cur.next.next;
                delNextFlag = true;
            } else {
                if (delNextFlag) {
                    cur.next = cur.next.next;
                    delNextFlag = false;
                } else {
                    cur = cur.next;
                }
            }
        }

        if (delNextFlag) {
            cur.next = cur.next.next;
        }

        return dummyHead.next;
    }
}

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == nullptr) {
            return nullptr;
        }

        ListNode* dummyHead = new ListNode(0, head);
        ListNode* cur = dummyHead;
        bool delNextFlag = false;

        while (cur->next != nullptr && cur->next->next != nullptr) {
            if (cur->next->val == cur->next->next->val) {
                cur->next = cur->next->next;
                delNextFlag = true;
            } else {
                if (delNextFlag) {
                    cur->next = cur->next->next;
                    delNextFlag = false;
                } else {
                    cur = cur->next;
                }
            }
        }

        if (delNextFlag) {
            cur->next = cur->next->next;
        }

        return dummyHead->next;
    }
};

时空复杂度

时间复杂度:O(N)。仅需一次遍历链表

空间复杂度:O(1)


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#AIGC##VDB# 【一篇入门VDB】矢量数据库-从技术介绍到选型方向

文章概览&#xff1a; 这篇文章深入探讨了矢量数据库的基本概念、工作原理以及在人工智能领域的广泛应用。 首先&#xff0c;文章解释了矢量的数学和物理学概念&#xff0c;然后引入了矢量在数据科学和机器学习中的应用。随后&#xff0c;详细介绍了什么是矢量数据库&#xff0…

【unity学习笔记】语音驱动blendershape

1.导入插件 https://assetstore.unity.com/packages/tools/animation/salsa-lipsync-suite-148442 1.选择小人&#xff0c;点击添加组件 分别加入组件&#xff1a; SALSA EmoteR Eyes Queue Processor&#xff08;必须加此脚本&#xff09;&#xff1a;控制前三个组件的脚本。…

基于深度学习的桃子熟度与大小智能检测

基于深度学习的桃子熟度与大小智能检测 基于深度学习的桃子熟度与大小智能检测引言1. 环境搭建与准备2. 数据准备3. 模型准备4. 训练准备5. 服务器端部署结语 基于深度学习的桃子熟度与大小智能检测 引言 随着时代的快速发展&#xff0c;人工智能时代为中国农业带来了新的机遇…

idea修改pom.xml没有重新导入maven的按钮

问题描述&#xff1a; IDEA修改pom.xml配置以后&#xff0c;不会展示 Load Maven Changes弹窗。 解决方法&#xff1a; 方式一、pom.xml右键&#xff0c;Maven--Run Maven--Reimport。但我感觉这个太麻烦了。 方式2、选择Building Tool Settings&#xff0c;点击Auto-Reload …

python -- str 字符串相减

从一个字符串中减去另一个字符串&#xff0c;得到一个新的字符串结果 replace() 方法 host_ip hello world host world ip host_ip.replace(host, "") print(ip)re.sub() 方法 import rehost_ip hello world host world ip re.sub(host, "", host_…

IDEA 启动错误提示:Command line is too long. Shorten command line

IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line Command line is too long. Shorten command line IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line快速修改原因解释 快速修改 Edit Configurations->configu…

IPv6路由综合运用

一、基础配置: SWA: sw1(config)#host swA swA(config)#ipv6 ena swA(config)# vlan 100 swA(config-vlan100)#int vlan 100 swA(config-if-vlan100)#ipv6 ena swA(config-vlan100)#ip add 172.16.1.1 255.255.255.252 swA(config-if-vlan100)#int e1/0/24 swA(conf…

C函数详解 | 函数的作用、定义与声明、函数的调用、函数与指针

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…

远程访问及控制

文章目录 远程访问及控制一、SSH远程管理1、SSH&#xff08;Secure Shell&#xff09;协议定义2、SSH的优点3、OpenSSHell 二、配置OpenSSH服务端1、sshd_config配置文件的常用选项2、sshd服务支持的两种验证方式2.1 密码验证2.2 秘钥对验证 三、SSH客户端程序的使用1、基本用法…

C# OpenCvSharp DNN 部署yolov3目标检测

目录 效果 yolov3.cfg 项目 代码 下载 C# OpenCvSharp DNN 部署yolov3目标检测 效果 yolov3.cfg [net] # Testing #batch1 #subdivisions1 # Training batch16 subdivisions1 width416 height416 channels3 momentum0.9 decay0.0005 angle0 saturation 1.5 exposure 1…

User-Agent(用户代理)是什么?

User-Agent&#xff08;用户代理&#xff09;是什么&#xff1f; User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客…

【Web】什么是 XSS 攻击,如何避免?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 常见方法&#xff1a; 结语 我的其他博客 前言 在当今数字化时代&#xff0c;网络安全成为信息技术领域中的一项至关重要的任务。X…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题&#xff1a;Mac 使用命令下载nvm 成功后执行 nvm -v 查看&#xff0c;报错&#xff1a;nvm command not found 2、原因&#xff1a;可能是系统更新后&#xff0c;默认的 shell 是 zsh&#xff0c;所以找不到配置文件 3、解决&#xff1a;可添加编辑.bash_profile 和 …

WebStom中代码美化工具prettier的配置

如果你的项目使用到了prettier代码美化工具之后&#xff0c;使用ctrlaltL调整代码格式的时候会发现&#xff0c;代码没有被正确格式化&#xff0c;这是因为prettier代码美化工具没有设置格式化vue代码的设置。在下面中的run for files的括号里面加上vue即可 最后一步就是确保es…

自媒体必备的8个素材网站,免费可商用。

自媒体必备的8个素材网站&#xff0c;视频、音效、音频、图片等素材非常齐全&#xff0c;免费下载&#xff0c;无需担心侵权&#xff0c;赶紧收藏起来吧~ 视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频…

11. PCL的搭建

在这里&#xff0c;前期已经在rk3588上搭建好了livox hap的环境&#xff0c;搭建好了ros环境&#xff0c;搭建好了rknn环境&#xff0c;接下来搭建PCL环境&#xff0c;因为后期的点云数据处理基本上都要用到PCL库处理点云数据。这里的搭建是看了下面博主的内容&#xff0c;抄过…

如何解决游戏显示找不到x3daudio1_7.dll,六种修复方法详解分享

一、x3daudio17.dll的作用 x3daudio17.dll是微软公司开发的一个动态链接库文件&#xff0c;它提供了音频处理和渲染的功能。该文件主要负责处理三维音效和多声道音频的输出&#xff0c;使得计算机可以提供更加逼真和立体的音频效果。因此&#xff0c;当x3daudio17.dll丢失时&a…

Linux系统命令 --- seq tr cut sort uniq

目录 一、seq ---- 输出序列化参数 1、seq 数字 按照顺序打印 2、-s 使用指定字符串分割数字 3、计算1-20&#xff0c;并求和 4、-w 在每一列数字前加零 默认补全 二、tr、对数字进行处理 1、替换 2、删除 3、压缩 4、补集 三、cut 截取 四、sort 排序 …

2023 年东北三省一区职业院校技能大赛“云计算应用(高职组)”赛项样题

2023 年东北三省一区职业院校技能大赛“云计算应用(高职组)”赛项样题 目录&#xff1a;需要竞赛软件包环境可练习博主&#xff01; 2023 年东北三省一区职业院校技能大赛“云计算应用(高职组)”赛项样题 模块一 私有云&#xff08;30 分&#xff09; 任务 1. 私有云服务搭建&…
最新文章