LeetCode 82. 删除排序链表中的重复元素 II(c++)

66 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

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

二、思路分析

这是一道中等难度的题目,也是第一道我自己完全独立做出来的题目!

由于涉及到删除的操作,在链表中不得不考虑头节点的特殊情况,即如果我们要删除的元素包括了头节点该怎么办。所以需要在前面加一个哨兵节点,这样就能妥善的解决这个特殊情况。

在调试中,还有比较特殊的是,假如最后的是重复节点需要删除该怎么办?所以在while循环结束后我又进行了分类讨论,解决这种特殊情况,最后终于成功通过。

但有瑕疵的是,这些被删除的节点,仍旧储存在系统中,并没有得到释放,只是不存在于链表中了。

三、AC代码

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

提交排名

image.png

四、总结

在遇到一些bug时,我们可以在软件上调试,也可以在纸上画图,看哪种方法更快。