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;
    }
};
相关推荐
那个村的李富贵2 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿2 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码2 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
熬夜有啥好2 小时前
数据结构——哈希表
数据结构·散列表
琹箐2 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia13 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了3 小时前
数据结构之树(Java实现)
java·算法
算法备案代理3 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.3 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久3 小时前
【初阶数据结构01】——顺序表专题
数据结构