LeetCode 82 - Remove Duplicates from Sorted List II

原创 2015年09月07日 12:30:15

Remove Duplicates from Sorted List II

题目链接

https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/

问题描述

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

解题思路

一. 递归法
递归跳出条件:当前结点或当前结点的下一结点为空
递归过程:若当前结点值与下一结点值相同,则找到第一个不相同的结点,返回对该结点的递归结果;若当前结点值与下一结点值不同,则令当前结点的next域指向下一结点的递归结果,并返回当前结点指针

二. 迭代法(常规法)
1. 创建一个新的头结点L作为返回,设置工作指针*p及判别指针*p1、*p2,初始时令*p指向L,*p1指向所给链表的第一个结点
2. 扫描链表,令*p2指向与*p1值不相同的第一个结点,若p2不是p1的next指向,则将p1挂在L之后
3. 令p1指向p2,重复步骤2
4. 扫描结束,返回L的next域

Tips:
1. 使用迭代法时可设置挂载标记,以减少对空指针的判定
2. 迭代法循环结束后,注意将最后一个结点加入结果链表

代码实现(C++)

递归法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head || ! head -> next) return head;

        ListNode* p = head -> next;
        if (p->val == head->val) {
            while (p && p->val == head->val) {
                p = p->next;    // 寻找第一个不相同的结点
            }
            return deleteDuplicates(p);
        } else {
            head->next = deleteDuplicates(p);
            return head;
        }
    }
};

迭代法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head || ! head -> next) return head;

        ListNode* L = new ListNode(-1);    // 结果链表头结点
        ListNode *p, *p1, *p2;
        bool addFlag;    // 挂载标记

        p = L; p1 = head;
        while (p1 && p1->next) {
            addFlag = true;
            p2 = p1->next;

            while (p2 && p2->val == p1->val) {
                p2 = p2->next;
                if (addFlag) addFlag = false;
            }

            if (addFlag) {    // 满足挂载条件,将结点加入结果链表
                p->next = p1;
                p = p->next;
            }

            p1 = p2;
        }

        p->next = p1;    // 将最后一个结点接入链表
        return L->next;
    }
};

效率

两种方法均只对链表遍历一遍,时间复杂度:O(n)
两种方法均只需固定空间开销,空间复杂度:O(1)

相关文章推荐

LeetCode82:Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct num...

【一天一道LeetCode】#82. Remove Duplicates from Sorted List II

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目...

LeetCode - 82. Remove Duplicates from Sorted List II

这一道题目主要是链表的操作,一开始因为情况比较复杂,把自己绕晕了,所以没想到这道题目的解法,后来看了答案才觉得自己解起来确实很难解出。这道题目对于链表的操作比较复杂,所要考虑的情况也很多,最大的一个技...

leetcode_82_Remove Duplicates from Sorted List II

思路: 大致思路就是,遍历链表找出重复元素的子列并删除重复元素子列,当然,第一个元素开始有重复元素的话比较特种,需要特殊考虑。删除子列的过程稍微有点绕,题目倒是不难理解。...

[leetcode 82]Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb...

LeetCode 82. Remove Duplicates from Sorted List II pre指针,首元素的处理

题目 题意 注意 思路 代码 结果题目 Given a sorted linked list, delete all nodes that have duplicate numbers, leav...

[leetcode] 82. Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb...

[LeetCode]82.Remove Duplicates from Sorted List II

【题目】 Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distin...

leetcode || 82、Remove Duplicates from Sorted List II

problem: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving onl...

【leetcode c++】82 Remove Duplicates from Sorted List II

Remove Duplicates from Sorted List II Given a sorted linked list, delete allnodes that have duplica...
  • hqq39
  • hqq39
  • 2015年07月17日 23:16
  • 279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 82 - Remove Duplicates from Sorted List II
举报原因:
原因补充:

(最多只允许输入30个字)