LeetCode刷题笔记 82. 删除排序链表中的重复元素 II

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

题目要求

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

题解

https://github.com/soulmachine/leetcode

递归版

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head||!head->next) return head;
        ListNode *p=head->next;
        if(head->val==p->val){    // 出现重复的情况
            while(p&&head->val==p->val){                
                p=p->next;              
            }
            //跳出while时p指向重复的n个元素之后的第一个不同元素
            delete head;
            return deleteDuplicates(p);  // 此时相当于从p的位置继续使用算法
        }
        else{
            head->next=deleteDuplicates(head->next); // 不重复时相当于从下个元素开始继续算法
            return head;
        }
    }
};
执行用时 内存消耗
12 ms 17.3 MB

迭代版

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr) return head;

        ListNode dummy(INT_MIN);   //头结点
        dummy.next=head;
        ListNode *prev=&dummy,*cur=head;
        while(cur!=nullptr){
            bool duplicated=false;
            while(cur->next!=nullptr&&cur->val==cur->next->val){
                duplicated=true;                
                cur=cur->next;                         
            }   //此时cur指向的是相同元素中的最后一个
            if(duplicated){   // 删除重复的最后一个元素                
                cur=cur->next;  //指向与相同元素末尾的下一个元素             
                continue;
            }
            prev->next=cur;  //上一个未被删除的元素->当前元素(不用被删除)
            prev=prev->next;  
            cur=cur->next;
        }
        prev->next=cur; //最后一个元素指向nullptr  所以这句也可以写成  prev->next=nullptr;
        return dummy.next;
    }
};
执行用时 内存消耗
12 ms 9.2 MB
发布了18 篇原创文章 · 获赞 0 · 访问量 1802

猜你喜欢

转载自blog.csdn.net/g534441921/article/details/104148332