题意:
        在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 
        例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5。


方法一:
计数+新建链表

思路:
       第一次遍历链表,对数值计数。
        第二次遍历链表,将不重复的节点加入新链表。



class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==nullptr)
            return nullptr;
        unordered_map<int,int> mp;//计数数组
        for(ListNode* p=pHead;p!=nullptr;p=p->next){//遍历计数
            mp[p->val]++;
        }
        
        ListNode *head=nullptr,*tail;//新建链表
        for(ListNode* p=pHead;p!=nullptr;p=p->next){//遍历链表
            if(mp[p->val]==1){//如果节点个数为1,则加入新链表
                if(head==nullptr){
                    head=p;
                    tail=p;
                }else{
                    tail->next=p;
                    tail=p;
                }
            }
        }
        tail->next=nullptr;
        return head;//返回头结点
    }
};


时间复杂度:
空间复杂度:


方法二:
计数+原地链表操作

思路:   
        第一次遍历链表,对数值计数。
        第二次遍历链表,原地操作链表删除重复的节点。



class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==nullptr)
            return nullptr;
        unordered_map<int,int> mp;//计数数组
        for(ListNode* p=pHead;p!=nullptr;p=p->next){//遍历计数
            mp[p->val]++;
        }
        
        while(pHead&&mp[pHead->val]>1)//删除重复节点
            pHead=pHead->next;
        if(pHead==nullptr)
            return nullptr;
        ListNode *p=pHead,*q=pHead->next;
        while(q){//删除重复节点
            if(mp[q->val]>1){
                p->next=q->next;
                q=q->next;
            }else{
                p=p->next;
                q=q->next;
            }
        }
        return pHead;//返回头结点
    }
};

时间复杂度:
空间复杂度: