【刷题笔记4】LeetCode 82. 删除排序链表中的重复元素 II (链表处理经典题目)

2023-11-13

 

系列索引 : 【刷题笔记0】系列目录索引(持续更新 & 推荐收藏)

本题题目: LeetCode 82. 删除排序链表中的重复元素 II

分类: 链表

难度: 中等

老规矩,先上AC图:


题目:

82. 删除排序链表中的重复元素 II(点击直达原网站)

示例 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
  • 题目数据保证链表已经按升序排列

题解:

时间复杂度: O(N),其中 n 是链表的长度;  空间复杂度: O(1).

由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。主要思想就是:一边遍历、一边统计相邻节点的值是否相等,如果值相等就继续后移找到值不等的位置,然后删除值相等的这个区间

具体实现细节需要注意: 由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node) newHead 指向链表的头节点。

这里注意,一般如果需要对链表的头节点进行处理,一般都需要在链表头节点之前安排一个新的哑节点(dummy node)

具体地,定义一个指针 node 指向链表的哑节点作为标记重复结点的前结点(永远放到链表没有遍历的结点之前),定义一个指针 bar 指向链表的头节点 head 作为标记重复结点的尾,随后开始对链表进行遍历。如果当前 bar -> next 与 bar -> next -> next 对应的元素相同,所以bar 继续后移,一直找到 bar -> val != bar -> next -> val  ,此时的 bar -> next  就是值不等的节点。此时,我们将链表中所有元素值为 node -> val 的节点全部删除,也就是其中所有 node 和 bar 之间结点删除,也就是 node->next = bar->next,node 直接指向 bar下个结点(中间的就舍去了),之后bar也后移一位,处理下一组数。

如果判断之后,bar没有后移,也就是说node->next == bar,当前 bar -> val != bar -> next -> val 对应的元素不相同,那么说明链表中只有一个元素值为bar -> val 的节点,那么我们就可以将 node 和 bar分别往后移一位,处理下一结点。

当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 return newHead -> next; 即可。

注意: 

  • 需要注意 bar 以及bar -> 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 == NULL || head -> next == NULL)return head;
        ListNode* newHead = new ListNode(0);
        newHead -> next = head;
        ListNode* node = newHead;
        ListNode* bar = head;

        while(bar != NULL){
            while(bar->next != NULL && bar-> val == bar -> next -> val){
                bar =  bar -> next;
            }
            if (node->next == bar) {
                //pre和cur之间没有重复节点,pre后移
                node = node->next; 
            } else {
                //pre->next指向cur的下一个位置(相当于跳过了当前的重复元素)
                //但是pre不移动,仍然指向已经遍历的链表结尾
                node->next = bar->next;
            }
            bar = bar->next;
        }
        return newHead -> next;
    }
};

 上一篇: 从B站 (哔哩哔哩) 泄露的源码里发现了B站视频推荐的秘密

下一篇: 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了

如果有什么要补充的,欢迎下方

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【刷题笔记4】LeetCode 82. 删除排序链表中的重复元素 II (链表处理经典题目) 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • React项目 加入 TS

    1 全局安装ts npm i g typescript 2 创建tsconfig json tsc init 修改tsconfig json 开启jsx和allowJs配置 3 安装开发环境依赖 npm install save dev t
  • 数据分析:Pandas之Series用法总结

    文章目录 Series 一 导入Series 二 创建Series 1 使用列表或者numpy进行创建 默认索引为0到N 1的整数型索引 2 使用字典创建 推荐使用 三 Series的索引和切片 1 显式索引与切片 2 隐式索引与切片 四
  • 域名系统由什么服务器组成,域名(DNS)的有那三个组成部分

    域名制度 域名 DNS 的有那三个组成部分 DNS由下面三个部分组成 域名空间和资源记录 域名空间是一个树状结构 资源记录是与名字相关的一些数据 从概念上说 每个结点和域名空间树的叶子结点都有一定的信息 而查询是要查询出一些与之相关的特定信
  • 辛普森悖论及贝叶斯解释

    辛普森悖论 Simpson s Paradox 亦有人译为辛普森诡论 为英国统计学家E H 辛普森 E H Simpson 于1951年提出的悖论 即在某个条件下的两组数据 分别讨论时都会满足某种性质 可是一旦合并考虑 却可能导致相反的结论
  • leetcode 63. 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 现在考虑网格中有障碍物 那么从左上角到右下角将会有多少条不同的路径
  • ReactNative系列之四十八屏幕宽高

    有几种方式可以获取屏幕 依次来对比下 1 view gt onLayout measure 如果view是flex 1 则获取的为屏幕真正的可显示宽高 即全面屏含刘海高度 安全区模式不含刘海高度 实际 2 Dimens 监听change 在
  • 【实现一套爬虫数据抓取平台】[3-5-03] 微博长短地址转换

    文章目录 零 系列目录 一 背景 二 代码 三 总结 零 系列目录 写这套文章的时候 不会完全按照目录的顺序一篇一篇写 大家可以到目录中直接找到对应的章节进行查看 点我跳转 一 背景 新浪微博有两类地址 分别是 pc站地址 https we
  • VSCode配置C++开发环境:OpenCV

    文章目录 Linux 编译 调试 配置OpenCV Win10 编译调试 配置OpenCV 参考 最近在做深度学习的C 部署相关工作 于是写下这篇文档记录环境配置的过程 环境配置是一项非常繁琐的工作 无论从大学做相关作业还是到工作上 做这项
  • ORACLE中通过SQL语句(alter table)来增加、删除、修改字段

    ORACLE中通过SQL语句 alter table 来增加 删除 修改字段 1 添加字段 alter table 表名 add 字段 字段类型 default 输入默认值 null not null 2 添加备注 comment on c
  • Git合并代码流程——2023.05

    本文介绍一下如何将git上面的代码合并 一 把分支代码合并到master 首先切换到分支hello git checkout hello 使用git pull 把分支代码pull下来 git pull 切换到主分支 git checkout
  • 【收藏】开发人员看过来:11 个免费的开源 IDE

    1 Komodo Edit Windows Mac Linux Komodo Edit 是开源的 支持PHP Python Ruby JavaScript Perl Tcl XML HTML 5 and CSS 3 它具备语法着色 折叠 背
  • SSTI-2 继承关系 & 魔术方法

    主要内容学习自 B站 重庆橙子科技 SSTI 模板注入 我力推橙子科技的所有 CTF 课程 由于在模板注入时 我们能够注入的地方 终究只是一个变量 而不是 Python 语句 所以直接注入 Python 语句是不能执行的 需要一些特殊操作让
  • training set, validation set, test set的区别

    首先安利一下一个机器学习的入门在线课程 台湾大学机器学习 以及关于上面这个问题的一个解答 解答 大四做毕设的时候就有这个问题 当时没想明白 后面一直疑惑不解 直到今天才搞懂 首先写一下结论 training set 用来训练模型 valid
  • idea通过wsdl文件自动生成webservice客户端java代码

    今天做项目要从门户后台调用一个webservice接口获取角色对应的菜单列表 门户提供一个wsdl的url 之前没调过webservice接口 因为知道可以根据wsdl链接自动生成客户端代码 网上搜了一下 可以用idea自动生成 就试了一下
  • ssh放行端口_ssh 连接需要开放哪些端口

    目前的iptables如附 A OUTPUT o lo j ACCEPT A OUTPUT m state state RELATED ESTABLISHED j ACCEPT A OUTPUT m state state INVALID
  • 如何用Microsoft Office Visio画时序图

    文件 新建 软件和数据库 UML模型图 然后在左侧的形状中点击 UML序列
  • 爬取全国各地区汽车销量情况并用中国地图可视化展示

    爬取全国各地区汽车销量情况并用中国地图可视化展示 项目介绍 网页详情 代码 爬取数据代码 将爬取的数据保存到文档中 中国地图可视化 运行效果 项目介绍 爬取2017年全国各省份的汽车销量情况 由于数据源的问题 不包含台湾省的数据情况 并且利
  • dedecms sql批量导入文章

    dede addonarticle 附加文章表 dede archives 文档主表 dede arctiny 文档微 sql 直接存入文章 INSERT INTO dede archives id typeid typeid2 sortr
  • sql查询无结果返回空_Java Mybaties In查询无法返回结果映射对象

    问题描述 在Springboot mybaties mapper xml下 使用in查询参数由Java后台拼接字符串而来 执行查询后 Java后台收到的响应结果为null 但是将sql放至数据库查询时 发现能查到数据 列表未完全展示 最终效
  • 【刷题笔记4】LeetCode 82. 删除排序链表中的重复元素 II (链表处理经典题目)

    系列索引 刷题笔记0 系列目录索引 持续更新 推荐收藏 本题题目 LeetCode 82 删除排序链表中的重复元素 II 分类 链表 难度 中等 老规矩 先上AC图 题目 82 删除排序链表中的重复元素 II 点击直达原网站 示例 1 输入
Powered by Hwhale