LeetCode82. 删除排序链表中的重复元素 II(c++详解)

简介: 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。示例 1:

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。


示例 1:

image.png

输入:head = [1,2,3,3,4,4,5]

输出:[1,2,5]


示例 2:

image.png

输入:head = [1,1,1,2,3]

输出:[2,3


这个题的思想不难,难的是细节


1)我这里用的是,先常规的去遍历找到重复出现过得数,如果这个数重复出现了,那么nums的值就会大于一;


2)由于这里可能会出现第一个头结点就重复所以我们需要新设置一个结点指向头结点,不然删除第一个头结点后面的元素就会丢失,我们设置俩个指针,指向我们新设置的这个结点new_head,pre这个指针的作用是帮我们探路,如果发现这个结点满足条件是等于1的那么另一个指向new_head 的结点就把它的next指过来


3)最后我们由于没有把new_head给移动过,所以我们可以通过遍历其next遍历完整个链表,即返回new_head->next


正确代码1:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        map<int,int>nums;
        ListNode *p = head;
        ListNode *new_head = new ListNode(0,head);
        ListNode *pre =  new_head;
        ListNode *temp = new_head;
        //new_head->next =head;
        while(p)
        {
            nums[p->val]++;
            p = p->next; 
        }
        pre = pre->next;
        while(pre){
            if(nums[pre->val] > 1){
                temp->next= NULL;
                pre =pre->next;
            }
            else {
             temp->next =pre;
             temp = temp -> next;
             pre = pre->next;
            }
        }
        if(temp == new_head) return NULL;
        return new_head->next;
    }
};

官方解答

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head) {
            return head;
        }
        ListNode* dummy = new ListNode(0, head);
        ListNode* cur = dummy;
        while (cur->next && cur->next->next) {
            if (cur->next->val == cur->next->next->val) {
                int x = cur->next->val;
                while (cur->next && cur->next->val == x) {
                    cur->next = cur->next->next;
                }
            }
            else {
                cur = cur->next;
            }
        }
        return dummy->next;
    }
};


相关文章
|
3月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
46 1
|
3月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
47 0
|
11天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
30 5
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
61 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
40 0
|
3月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
39 0
|
3月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
38 0
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
7月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
69 2