CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

    • 双指针法理论基础
    • 左右指针

      • 验证回文串
      • 最多删除一个字符得到回文
      • 回文子字符串的个数
      • 反转字符串
      • 反转字符串II
      • 两数之和 II - 输入有序数组
      • 反转字符串中的单词 III
      • 翻转字符串里的单词
      • 剑指 Offer 58 - II. 左旋转字符串
      • 有序数组的平方
      • 三数之和
      • 四数之和
      • 删除排序链表中的重复元素
      • 删除排序链表中的重复元素 II
        • 📃 题目描述
        • 🔔 解题思路
        • 💥 复杂度分析
      • 删除有序数组中的重复项
      • 压缩字符串
      • 移除元素
      • 移动零
      • 调整数组顺序使奇数位于偶数前面
      • 最短无序连续子数组
      • 找到 K 个最接近的元素
      • 盛最多水的容器
    • 滑动窗口

    • 快慢指针

    • 其他

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 双指针法
  • 左右指针
小牛肉
2021-10-03
目录

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

# 📃 题目描述

题目链接:82. 删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

# 🔔 解题思路

使用两个指针,一个指针指向某段重复元素的前驱节点,另一个指针用来扫描重复元素。当遇到重复出现的节点时,直接遍历到该重复节点的末尾,然后删除两个指针中间这一段重复节点。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        // 添加一个头节点,方便处理
        ListNode dummy = new ListNode(0);
        dummy.next = head;
		
        // 指向重复元素的前驱节点
        ListNode pre = dummy;
        // 扫描重复元素
        ListNode cur = head;
        while (cur != null) {
            // 遇到重复出现的节点
            if (cur.next != null && cur.val == cur.next.val) {
                // 循环遍历到该重复节点的末尾
                while (cur != null && cur.next != null && cur.val == cur.next.val) {
                    cur = cur.next;
                }
                // 删除中间这一段重复节点
                cur = cur.next;
                pre.next = cur;
                // 删完这段重复元素后不能更新 pre,因为很有可能现在的 cur.next 又是一段重复元素
                // 比如 1 3 3 4 4, pre = 1, 删完 3 后,cur.next = 4,如果更新 pre 为 cur.next = 4 的话,显然是不合题意的(重复元素需要全部删除)
            } 
            else {
                pre = cur;
                cur = pre.next;
            }
        }
        
        return dummy.next;
    }
}

# 💥 复杂度分析

  • 空间复杂度:O(1)
  • 时间复杂度:O(N)

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
删除排序链表中的重复元素
删除有序数组中的重复项

← 删除排序链表中的重复元素 删除有序数组中的重复项→

最近更新
01
我掏出这个多线程轮子,面试官直接全体起立
04-13
02
面试官问你有其他 Offer 吗,该怎样回答
04-10
03
天不生陈志龙,职场万古如长夜
04-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式