• Leetcode | Remove Duplicates from Sorted List I && II


    Remove Duplicates from Sorted List I

    Given a sorted linked list, delete all duplicates such that each element appear only once.

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

    如果下一个节点和当前节点的值一样,就继续往后。这样找到的是重复数的最后一个。比如1->1->2; 

    当然也可以找到重复数的第一个数;

    注意delete掉那些重复的点。

     1 class Solution {
     2 public:
     3     ListNode *deleteDuplicates(ListNode *head) {
     4         ListNode *p = head, *newH = NULL, *tail, *tmp;
     5         while (p != NULL) {
     6             while (p->next != NULL && p->next->val == p->val) {
     7                 tmp = p->next; 
     8                 delete p;
     9                 p = tmp;
    10             }
    11             if (newH == NULL) {
    12                 newH = p;
    13             } else {
    14                 tail->next = p; 
    15             }
    16             tail = p;
    17             p = p->next;
    18         }
    19         return newH;
    20     }
    21 };

    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.

    和Remove Duplicates from Sorted List I类似。加了一个判断是否重复数的条件。最后tail要指向NULL,因为原链表最后一个元素不一定会加进来。

    这道题用c++很奇怪。下面的代码没有delete是可以accepted的。

     1 class Solution {
     2 public:
     3     ListNode *deleteDuplicates(ListNode *head) {
     4         ListNode *p = head, *newH = NULL, *tail, *current, *tmp;
     5         while (p != NULL) {
     6             current = p;
     7             while (p->next != NULL && p->next->val == p->val) p = p->next;
     8             if (p == current) {
     9                 if (newH == NULL) {
    10                     newH = p;
    11                 } else {
    12                     tail->next = p; 
    13                 }
    14                 tail = p;
    15             }
    16             p = p->next;
    17         }
    18         if (tail) tail->next = NULL;
    19         return newH;
    20     }
    21 };

    但是加了delete的逻辑之后就runtime error了。这份代码应该是没有问题的。难道是leetcode自己有问题?

     1 class Solution {
     2 public:
     3     ListNode *deleteDuplicates(ListNode *head) {
     4         ListNode *p = head, *newH = NULL, *tail, *current, *tmp;
     5         while (p != NULL) {
     6             current = p;
     7             while (p->next != NULL && p->next->val == p->val) {
     8                 tmp = p->next; 
     9                 delete p;
    10                 p = tmp;
    11             }
    12             tmp = p->next;
    13             if (p == current) {
    14                 if (newH == NULL) {
    15                     newH = p;
    16                 } else {
    17                     tail->next = p; 
    18                 }
    19                 tail = p;
    20             } else {
    21                 delete p;
    22             }
    23             p = tmp;
    24         }
    25         if (tail) tail->next = NULL;
    26         return newH;
    27     }
    28 };
  • 相关阅读:
    用户使用调查报告
    Beta阶段敏捷冲刺五
    Beta阶段敏捷冲刺四
    Beta阶段敏捷冲刺三
    Beta阶段敏捷冲刺二
    Beta阶段敏捷冲刺一
    软工网络15团队作业8——Beta阶段敏捷冲刺
    Beta阶段Scrum 冲刺博客合集
    软工网络15Alpha阶段敏捷冲刺博客集合
    项目复审——Beta阶段
  • 原文地址:https://www.cnblogs.com/linyx/p/3734084.html
Copyright © 2020-2023  润新知