day140—前后指针—删除排序链表中的重复元素Ⅱ(LeetCode-82)

题目描述

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

解决方案:

这段代码的核心功能是删除升序单链表中所有存在重复的节点(重复节点全部移除,而非保留一个) (比如原链表 1→2→2→3→3→3 变为 1,1→1→2→3 变为 2→3),采用「虚拟头节点 + 双层循环」实现,时间复杂度 O(n)、空间复杂度 O(1),是该进阶去重问题的经典解法。

核心逻辑

代码利用链表升序的特性,通过虚拟头节点规避头节点被删除的边界问题,再通过双层循环识别并删除所有重复节点:

  1. 虚拟头节点初始化 :创建虚拟头节点 node 指向原链表头 head,用 cur 指针从虚拟头节点开始遍历(避免删除原头节点时的空指针问题);
  2. 外层循环找重复起点 :循环检查 cur 的下一个和下下个节点,若二者值相等,说明存在重复节点,记录该重复值 v
  3. 内层循环删除所有重复节点 :持续将 cur->next 指向其后继节点,直到 cur->next 为空或值不等于 v,彻底删除所有值为 v 的节点;
  4. 无重复则移动指针 :若相邻节点值不相等,将 cur 移动到下一个节点继续遍历;
  5. 返回结果 :遍历完成后,返回虚拟头节点的 next(即去重后的链表头)。

总结

  1. 核心思路:依托升序链表重复节点相邻的特性,先识别重复值,再批量删除所有该值的节点,区别于 "保留一个重复节点" 的基础去重;
  2. 关键设计:虚拟头节点解决了 "头节点是重复节点需删除" 的边界问题,内层循环保证所有重复节点都被移除;
  3. 效率特点:一次遍历(内层循环仅为跳过重复节点,整体仍为线性遍历)完成去重,时间 O(n)、空间 O(1),是该进阶去重问题的最优解法。

函数源码:

cpp 复制代码
/**
 * 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)   return nullptr;
        ListNode* node=new ListNode();
        node->next=head;
        ListNode* cur=node;
        int v=0;
        while(cur->next && cur->next->next){
            v=cur->next->val;
            if(v==cur->next->next->val){
                while(cur->next && v==cur->next->val){
                    cur->next=cur->next->next;
                }
            }else{
                cur=cur->next;
            }
        }

        return node->next;
    }
};
相关推荐
Old Uncle Tom14 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆14 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移14 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业14 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
圣保罗的大教堂15 小时前
leetcode 1855. 下标对中的最大距离 中等
leetcode
智者知已应修善业16 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-117 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表
.54817 小时前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove18 小时前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊18 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法