AcWing 29. 删除链表中重复的节点

题目地址 https://www.acwing.com/problem/content/description/27/

来源:剑指Offer

题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。

样例

样例1
输入:1->2->3->3->4->4->5

输出:1->2->5
样例2
输入:1->1->1->2->3

输出:2->3

算法1
这是投机取巧的做法
在时间和空间不太要求的情况下
可使用STL进行unique的操作
遍历链表 将元素放进map
在遍历map将不重复的元素放进链表
注意边界条件

C++ 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    map<int,int> s;
    ListNode* deleteDuplication(ListNode* head) {
        ListNode* p = head;
        //边界情况直接返回
        if(p == NULL)
            return p;
        //将链表数值放入map 让容器自动去重
        while(p != NULL){
            s[p->val]++;
            p = p->next;
        }

        p = head;
        ListNode* pre=head;
        //遍历容器 再次放入链表
        for(auto& e:s){
            if(e.second == 1){
                p->val = e.first;
                pre = p;
                p = p->next;
            }
        }
        //多余的链表删除 这里直接NULL 没有释放
        pre->next=NULL;
        //注意边界条件
        if(pre == head)
            return NULL;
        return head;
    }
};

作者:defddr
链接:https://www.acwing.com/solution/AcWing/content/2877/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。