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;
    }
};
相关推荐
不会就选b6 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
Cccp.1239 小时前
【leetcode】(七)前缀树和贪心算法
数据结构·leetcode·贪心算法
千里码aicood9 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
做cv的小昊10 小时前
【World Model】π0.5:a Vision-Language-Action Model with Open-World Generalization
人工智能·算法·机器学习·大模型·多模态·vla·世界模型
لا معنى له10 小时前
World-In-World: World Models in a Closed-Loop World
算法
Logic10112 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Discipline102912 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
XuCoder12 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!13 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#