每天一道LeetCode-----移除有序链表中的重复节点

来源:互联网 发布:淘宝内部优惠券群号 编辑:程序博客网 时间:2024/05/01 01:23

Remove Duplicates from Sorted List

原题链接Remove Duplicates from Sorted List
这里写图片描述

给定一个有序链表,对于链表中所有重复元素,只保留一个,其余的都删掉

因为链表是有序的,而且所有重复节点中只需要保留一个,所以假设上一个找到的节点是prev,当前找到的节点是cur,那么只需要判断cur->val和prev->val是否相等,即可判断要不要将cur添加到结果链表中

/** * 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) {        ListNode* prev = head;        ListNode* cur = head->next;        while(cur)        {            if(cur->val != prev->val)            {                prev->next = cur;                prev = cur;            }            cur = cur->next;        }        return head;    }};

另一种方法,可以考虑

因为链表是有序的,相同的元素都集中在一起,所以只需要保留

  • 下一个节点是null的节点
  • 不重复的节点
  • 重复节点的最后一个节点

假设当前节点为cur

判断下一个节点是否是null的方法为

if(!cur->next)

判断当前节点不是重复节点或者是重复节点的最后一个节点的方法为

if(cur->val != cur->next->val)

代码如下

/** * 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) {        ListNode* header = new ListNode(-1);        header->next = head;        ListNode* cur = head;        ListNode* prev = header;        while(cur)        {            /* 最后一个节点或相同节点的最后一个 */            if(!cur->next || cur->val != cur->next->val)            {                prev->next = cur;                prev = cur;            }            cur = cur->next;        }        head = header->next;        delete header;        return head;    }};

Remove Duplicates from Sorted List II

原题链接Remove Duplicates from Sorted List II

这里写图片描述

仍然是去掉重复节点,但是重复节点一个都不保留

在上面的情况中,需要保留重复节点的最后一个节点,但是这里不需要保留,根据上面的解释

if(cur->val != cur->next->val)

可以判断当前节点不是重复节点或者是重复节点的最后一个节点,所以为了抛出第二种情况,在进入条件后仍然需要再次判断

可以通过一个变量记录当前节点是否是重复节点的最后一个节点,方法是如果

if(cur->val == cur->next->val)

那么cur->next可能就是重复节点的最后一个节点,只需要在前一次记录即可

代码如下

/** * 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) {        ListNode* header = new ListNode(-1);        header->next = head;        ListNode* cur = head;        ListNode* prev = header;        bool duplicate = false;        while(cur)        {            if(!cur->next || cur->val != cur->next->val)            {                /* duplicate为false表示当前节点不是重复节点 */                if(duplicate == false)                {                    prev->next = cur;                    prev = cur;                }                else                {                    duplicate = false;                }            }            else            {                /* 令duplicate为true表示当前节点是重复节点 */                duplicate = true;            }            cur = cur->next;        }        prev->next = nullptr;        head = header->next;        delete header;        return head;    }};

这两道题主要需要解决的是如何判断重复节点,如果需要保留一个重复节点,那么每次遇到一个新节点就添加到结果中。如果不需要保留重复节点,那么就需要增加一层判断条件,可以记录这个节点是否是重复节点

阅读全文
0 0
原创粉丝点击