zoukankan      html  css  js  c++  java
  • [Leetcode 70] 82 Remove Duplicates from Sorted List II

    Problems:

    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.

    Analysis:

    This problem is a bit different from the classic probelm of removing duplicates. Here we need to delete all nodes of duplication. To achieve this, three pointers and a flag are needed.

    ListNode *ppre is used to point to the node that before dup;

    ListNode *pre is used to point to the first node of the duplication;

    ListNode *cur is used to point to the current checking node;

    bool isDup is used to indicate whether there's duplication;

    The checking process is as follows:

    1. first check whther pre.val equals cur.vla or not; if equal go to step 2 else go to step 3

    2. remove the cur node, and set the isDup flag; go back to step 1;

    3. check whether isDup is set or not; if set, delete the pre node. otherwise move all three pointers one node further.

    The space needed is constant and the time complexity is O(n).

    One thing to remember is that after exitting the while loop, we need an extra check of isDup to decide whether delete or not the last node of the list

    Code:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *deleteDuplicates(ListNode *head) {
    12         // Start typing your C/C++ solution below
    13         // DO NOT write int main() function
    14         if (head == NULL || head->next == NULL)
    15             return head;
    16         
    17         ListNode dmy(-1);
    18         dmy.next = head;
    19         
    20         ListNode *ppre = &dmy, *pre = head, *cur = head->next;
    21         bool isDup = false;
    22         
    23         while (cur != NULL) {
    24             if (cur->val == pre->val) {
    25                 isDup = true;
    26                 pre->next = cur->next;
    27                 cur->next = NULL;
    28                 delete cur;
    29                 cur = pre->next;
    30             } else {
    31                 if (isDup) {
    32                     ppre->next = pre->next;
    33                     pre->next = NULL;
    34                     delete pre;
    35                     pre = cur;
    36                     cur = cur->next;
    37                     isDup = false;
    38                 } else {
    39                     ppre = pre;
    40                     pre = cur;
    41                     cur = cur->next;
    42                 }
    43             }
    44         }
    45         
    46         if (isDup) {
    47             ppre->next = pre->next;
    48             pre->next = NULL;
    49             delete pre;
    50         }
    51             
    52         return dmy.next;
    53     }
    54 };
    View Code
  • 相关阅读:
    InnoDB 事务
    InnoDB 索引
    MySQL 8 事务管理、数据库维护、改善性能
    MySQL 7 存储过程、游标、触发器
    MySQL 6 插入数据(INSERT INTOVALUESSELECT FROM)、更新和删除数据(UPDATE SET WHEREDELETE)、创建和操纵表、视图
    MySQL 5 联结表、创建高级联结、组合查询、全文本搜索
    MySQL 4 数据处理函数、汇总数据、分组数据、子查询
    MySQL 3 通配符、正则、计算字段
    MySQL 2 SQL数据使用(检索、排序、过滤:SELECT/FROM/LIMIT/ORDER BY/DESC/WHERE/AND/OR/IN/NOT)
    JavaScript相关-深入理解函数2
  • 原文地址:https://www.cnblogs.com/freeneng/p/3203373.html
Copyright © 2011-2022 走看看