当前位置: 首页 > article >正文

leetcode82:删除链表中的重复元素II

原题地址:82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

题目描述

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

示例 1:

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

示例 2:

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

解题思路

  1. 问题概述

    • 给定一个排序链表,删除所有含有重复数字的节点,只留下原始链表中没有重复的元素。
  2. 问题分析

    • 这是一个典型的链表问题,要求删除重复元素,特别是当元素有重复时,所有重复的元素都需要被删除,保留一个唯一的元素。
    • 注意到链表是排序的,因此重复的元素总是出现在相邻的位置。
  3. 解题思路

    • 设立一个虚拟头节点 dummy,这样可以避免处理头节点的特殊情况。
    • 使用 cur 指针来遍历链表。
    • 当发现当前节点与下一个节点值相等时,说明有重复元素,应该将这些重复节点全部删除。
    • 否则,移动 cur 指针到下一个节点。
    • 最终返回 dummy.next,即去掉虚拟头节点后的链表。
  4. 具体步骤

    • 通过 dummy 节点指向链表的头部,这样就可以避免一些特殊情况(比如删除头节点时需要特别处理)。
    • 遍历链表,若当前节点与下一个节点值相同,说明是重复节点,跳过所有相同的节点。
    • 如果当前节点与下一个节点不同,则将 cur 指向下一个节点,继续遍历。

源码实现

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 如果链表为空,直接返回空链表
        if (head == null) {
            return head;
        }
        
        // 设置虚拟头节点,方便删除操作
        ListNode dummy = new ListNode(0, head);

        // cur 指针初始化为虚拟头节点
        ListNode cur = dummy;

        // 遍历链表
        while (cur.next != null && cur.next.next != null) {
            // 如果当前节点与下一个节点的值相同,说明有重复节点
            if (cur.next.val == cur.next.next.val) {
                int x = cur.next.val;  // 记录重复的值
                // 跳过所有值等于 x 的节点
                while (cur.next != null && cur.next.val == x) {
                    cur.next = cur.next.next;  // 删除当前节点
                }
            } else {
                // 否则,正常移动 cur 指针
                cur = cur.next;
            }
        }

        // 返回去掉虚拟头节点后的链表
        return dummy.next;
    }
}

复杂度分析

  1. 时间复杂度

    • 链表最多遍历一遍,因此时间复杂度为 O(n),其中 n 是链表的节点数。
  2. 空间复杂度

    • 我们只用了常数空间来存储 dummy 和 cur,因此空间复杂度为 O(1)

http://www.kler.cn/a/454886.html

相关文章:

  • git自动压缩提交的脚本
  • 强化学习基础之贝尔曼期望方程
  • C++、Python有哪些相同和不同
  • Python+Django 技术实现自动化漏洞扫描系统开发
  • 探秘仓颉编程语言:使用体验与功能剖析
  • 五十六:Stream的状态变迁
  • 【蓝桥杯】走迷宫
  • 题海拾贝:蓝桥杯 2020 省AB 乘法表
  • 免费资源网站
  • ANSYS EMC Plus:谐振腔中的天线
  • Markdown语法字体字号讲解
  • git revert
  • 【C#】WPF设置Separator为垂直方向
  • (icml2024)SLAattention,基于原文时序模型进行改进
  • 【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火
  • 项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战
  • LeetCode 热题 100_二叉树的中序遍历(36_94_简单_C++)(二叉树;递归(中序遍历);迭代)
  • 如何在 Ubuntu 22.04 上安装 Ansible 教程
  • OpenStack系列第三篇:CentOS7 上部署 OpenStack(Train版)集群教程 Ⅲ Nova Neutron 服务部署
  • Go语言反射从入门到进阶
  • js 生成二维码(qrcodejs2-fix)
  • Intel AMD Hygon CPU缓存
  • 分阶段总结:建材制造业“数字化转型”总体架构与实现路径
  • 06 - Django 视图view
  • 拉链表,流⽔表以及快照表的含义和特点
  • vscode remote-ssh 免密登录不生效的问题