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)

Remove Duplicates from Sorted List II 移除重复元素和其本身(重重)

题目: 点击打开链接 解答: 设置一个flag标志 代表当前元素是否是重复元素 如果是重复元素 在...
  • skyoceanlover
  • skyoceanlover
  • 2014年08月29日 20:49
  • 284

Remove Duplicates from Sorted List(去除有序链表中的重复元素)

Given a sorted linked list, delete all duplicates such that each element appear only once.(给定一个有序链表,...
  • ajiangfan
  • ajiangfan
  • 2016年10月12日 11:17
  • 254

CareerCup之2.1无序链表删除重复元素

【题目】 原文: 2.1 Write code to remove duplicates from an unsorted linked list. FOLLOW UP H...
  • SunnyYoona
  • SunnyYoona
  • 2014年05月18日 17:08
  • 1936

Remove Duplicates from Sorted Array——移除排序数组中重复元素

Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such tha...
  • suibianshen2012
  • suibianshen2012
  • 2016年08月17日 23:09
  • 241

Leetcode全数组问题

目录 1、编号2 Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respe...
  • wangxiaojun911
  • wangxiaojun911
  • 2014年02月06日 03:32
  • 6370

Remove Duplicates from Sorted Array II 从有序数组里移除重复出现元素,最多重复出现2次 @LeetCode

这是一类典型的题,思路是,一开始可以再开一个辅助数组,这样会更直观一些。如果新数组改变不会影响原数组,则可以合并起来,如本题。 package Level2; import java.util...
  • hellobinfeng
  • hellobinfeng
  • 2013年10月20日 12:55
  • 4293

Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先,这是一道远古之前的题的进化版: Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了,因为我也记不住了。。这道题意思就是ABCD四个数组,长...
  • MebiuW
  • MebiuW
  • 2016年11月16日 22:45
  • 2786

【LeetCode-面试算法经典-Java实现】【113-Path Sum II(路径和)】

【113-Path Sum II(路径和II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree and a sum, find al...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月12日 06:23
  • 2511

【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】

【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a l...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月22日 07:24
  • 2063

【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Give...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月04日 06:54
  • 1547
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 82 - Remove Duplicates from Sorted List II
举报原因:
原因补充:

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