【链表】Leetcode 82. 删除排序链表中的重复元素 II【中等】

news2024/11/17 3:29:53

删除排序链表中的重复元素 II

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

示例 1:

在这里插入图片描述
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

解题思路

由于链表是已排序的,所以重复的节点会相邻出现。可以使用双指针法来解决这个问题,一个指针用于遍历链表,另一个指针用于跟踪上一个未重复的节点。

  • 遍历链表:使用两个指针pre和current。pre用于指向上一个未重复的节点,current用于遍历链表。
  • 删除重复节点:如果current和current.next的值相等,则继续向前遍历直到遇到不同的值为止。将pre.next指向当前遇到的第一个不同值节点。
  • 移动指针:如果current和current.next的值不同,pre移动到current位置,current继续向前遍历。
  • 返回结果:返回哨兵节点的下一个节点。

Java实现

public class DeleteDuplicates {
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    public ListNode deleteDuplicates(ListNode head) {
        // 创建哨兵节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode current = head;
        
        while (current != null) {
            // 跳过当前节点后面所有的重复节点
            while (current.next != null && current.val == current.next.val) {
                current = current.next;
            }
            // 如果pre的下一个节点是current,说明当前节点没有重复
            if (pre.next == current) {
                pre = pre.next;
            } else {
                // 如果pre的下一个节点不是current,说明有重复节点,跳过所有重复节点
                pre.next = current.next;
            }
            current = current.next;
        }
        
        return dummy.next;
    }

    public static void main(String[] args) {
        DeleteDuplicates deleteDuplicates = new DeleteDuplicates();

        // 创建示例链表 1->2->3->3->4->4->5
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(3);
        head.next.next.next.next = new ListNode(4);
        head.next.next.next.next.next = new ListNode(4);
        head.next.next.next.next.next.next = new ListNode(5);

        // 删除重复节点
        ListNode newHead = deleteDuplicates.deleteDuplicates(head);
        printList(newHead); // 输出: 1->2->5
    }

    // 辅助方法:打印链表
    public static void printList(ListNode head) {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val);
            if (current.next != null) {
                System.out.print("->");
            }
            current = current.next;
        }
        System.out.println();
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的节点数。需遍历链表一次。
  • 空间复杂度:O(1),只使用了几个额外的指针。

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

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

相关文章

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中,存在着两种对运动的描述,一种为拉格朗日描述,即通过描述每个物质点的运动来描述整个变形体的运动,也…

电脑如何远程访问?

【天联】的使用场景 电脑远程访问在现代科技的发展中扮演了重要的角色。对于企业和个人用户来说,远程访问的便利性提供了许多机会和可能性。作为一种高效的工具,【天联】具有广泛的应用场景,可以实现异地统一管理、协同办公以及远程数据采集…

一文了解MyBatis

文章目录 MyBatis1. MyBatis的执行流程2. MyBatis是否支持延迟加载3. MyBatis延迟加载的底层原理4. MyBatis的二级缓存机制用过吗5. 谈谈MyBatis框架的优势6. 简单描述MyBatis的工作原理7. MyBatis中的sql标签8. MyBatis中的${}和#{}的区别9. MyBatis中ResulyMap的作用[重要]10…

在Python中实现限定抽奖次数的机制

目录 一、引言 二、需求分析 三、设计思路 四、代码实现 4.1 使用字典存储用户抽奖次数 4.2 使用数据库存储用户抽奖次数 五、扩展与优化 六、总结 一、引言 在当今互联网应用中,抽奖系统作为吸引用户、提高用户参与度和活跃度的重要手段,已经被…

展望跨境智慧银行在全球化金融服务中的发展趋势和机遇

一、引言 随着全球经济的不断融合和金融科技的迅猛发展,跨境智慧银行作为连接不同国家和地区金融市场的桥梁,正逐渐展现出其独特的魅力和潜力。跨境支付与结算作为跨境智慧银行的核心业务之一,随着全球化的深入发展和国际贸易的日益频繁,其业务场景也愈发丰富和复杂。本文…

【智能算法应用】灰狼算法GWO求解三维路径规划问题

目录 1.算法原理2.三维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法(GWO)原理及实现 2.三维路径规划数学模型 三维地形可以等效处理成山峰地形,数学模型为: z ( x , y ) h 0 ∑ j 1 N h j max ⁡…

Vitis HLS 学习笔记--块级控制协议-ap_ctrl_chain/ap_ctrl_hs/ap_ctrl_none

目录 1. 简介 2. 详细分析 2.1 使用场景区别 2.2 ap_continue 行为详解 2.3 ap_ctrl_chain 行为详解 3. 总结 1. 简介 块级控制协议允许硬件模块表明: 何时可以开始处理数据。何时完成了数据处理。以及何时处于空闲状态,准备接受新的数据输入。 …

【放球问题】920. 播放列表的数量

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 本题同解 【动态规划】【组合数学】【C算法】920播放列表的数量 LeetCode 920. 播放列表的数量 你的音乐播放器里有 n 首不同的歌,在旅途中,你计划听 goal 首歌(不一定不同&#x…

冯喜运:5.29市场避险情绪升温,黄金原油小幅收涨

【黄金消息面分析】:周二(5月28日)美盘时段,由于美元走弱且市场情绪出现负面变化,黄金收复早前跌幅,站上2350美元关口。金价早盘一度走弱,源于美联储降息可能性降低带来压力,投资者在…

工作软件新宠儿

想要让你的工作效率飞起来吗?👀 是时候告别那些大众化的工作软件啦!今天,我要给大家种草几款不常见的但超级实用的工作软件🌱,保证让你事半功倍哦!🌟 1️⃣ 亿可达 它是一款自动化…

基于ssm的微信小程序的居民健康监测系统

采用技术 基于ssm的微信小程序的居民健康监测系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringMVCMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 后端页面 用户信息管理 健康科普管理 公告管理 论坛…

读人工智能时代与人类未来笔记17_人类未来

1. 人类未来 1.1. 在印刷读物出现之前,中世纪的欧洲人主要通过社区传统获取知识 1.1.1. 通过参与收割和季节轮作积累民间智慧 1.1.2. 在礼拜场所践行信仰并遵守圣礼 1.1.3. 加入行业公会,学习技术&…

颈源性头痛症状及表

颈源性头痛一般表现为,就是说从枕后一直颞侧,到太阳穴附近,这个是枕小的一个疼痛,还有一部分人从枕后,沿着一个弧线(如下图)的轨迹到了前额,到我们前额,这样一个疼痛&…

详解makefile中的$(wildcard pattern)

在 Makefile 中,$(wildcard pattern) 是一个函数,用于匹配指定模式的文件,并返回符合条件的文件列表。这个函数通常用于获取符合特定模式的文件名,在编写 Makefile 时非常有用。 语法: makefile $(wildcard pattern)…

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

如何成为一名合格的JAVA程序员?

如何成为一名称职的Java编程人员&#xff1f;你一定不能错过的两本书。 第一本《Java核心技术速学版&#xff08;第3版&#xff09;》&#xff01; 1.经典Java作品《Java核心技术》的速学版本&#xff0c;降低学习门槛&#xff0c;帮助读者更容易学习Java&#xff0c;更快地把…

Neural Filters:照片恢复

Ps菜单&#xff1a;滤镜/Neural Filters/恢复/照片恢复 Neural Filters/RESTORATION/Photo Restoration 照片恢复 Photo Restoration借助 AI 强大功能快速恢复旧照片&#xff0c;提高对比度、增强细节、消除划痕。将此滤镜与着色相结合以进一步增强效果。 “照片恢复”滤镜利用…

阿里开源React应用动效解决方案:ant-motion

ant-motion&#xff1a;简化动效开发&#xff0c;提升用户体验 - 精选真开源&#xff0c;释放新价值。 概览 Ant Motion是由Ant Design团队精心打造&#xff0c;专为React应用设计的动画规范和组件库。它不仅仅是一套动画规范&#xff0c;更是一个完整的解决方案&#xff0c;旨…

晓语台:基于大语言模型和深度学习技术的智能创作平台,高效、个性化地创作高质量内容。

晓语台 AI&#xff1a; 晓语台是由北京字里心间科技有限公司推出的一款智能AI写作工具。它基于百度的大语言模型和混合大模型以及AIGC技术研发而成&#xff0c;内置了多种风格和主题的AI创作模板&#xff0c;覆盖了20余类行业与职业&#xff0c;近30个海内外社交平台&#xff…