LeetCode——删除排序链表中的重复元素 II

转载自https://www.cnblogs.com/ariel-dreamland/p/9159155.html

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:


示例 2:

示例给出的例子,重复的数都是相连的,考虑问题时我以为存在重复的数不相邻的情况,所以用了map,第一次遍历来统计所有各val值出现的次数。然而,程序没调通,AC为0。。。。。

#include<cstdlib>
#include<map>
#include<iterator>
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
    if(!head || head->next == NULL) return head;
        ListNode *node = head, *next = NULL;
        map<int,int> mymap;
        map<int,int>::iterator iter;
        while(node != NULL)
        {
            iter = mymap.find(node->val);
            if(iter != mymap.end())
            {
                mymap[node->val]++;
            }
            else
                mymap.insert(pair<int, int>(node->val, 0));
        }
        
        while(mymap[head->val] > 1)
        {
            head = head->next;
        }
        node = head;
        while(node->next != NULL)
        {
            if(mymap[node->next->val] > 1)
            {
                node->next = node->next->next;
                continue;
            }
            node = node->next;
        }
        
        return head;
    }
};

而后,看了下别人写的

由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的next指向下面那个不同的元素。如果现指针遍历的第一个元素就不相同,则把前驱指针向下移一位。

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (!head || !head->next) return head;         
        ListNode *start = new ListNode(0);
        start->next = head;
        ListNode *pre = start;
        while (pre->next) {
            ListNode *cur = pre->next;
            while (cur->next && cur->next->val == cur->val) 
                cur = cur->next;
            if (cur != pre->next) 
                pre->next = cur->next;
            else 
                pre = pre->next;
        }
    return start->next;
    }
};

猜你喜欢

转载自blog.csdn.net/eartha1995/article/details/81011413
今日推荐