题意:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。
方法一:
unordered_map计数
思路:遍历链表,统计各值出现的次数。
再遍历链表,判断并将计数为1的节点加入新链表。返回新链表。
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;//新建头指针 ListNode* p; for(ListNode* p1=pHead;p1!=nullptr;p1=p1->next){ if(mp[p1->val]==1){//计数为1的节点加入链表 ListNode* q=new ListNode(p1->val); if(head==nullptr){//插入新节点 head=q; p=q; }else{ p->next=q; p=q; } } } return head; } };
时间复杂度:空间复杂度:
方法二:
直接原地操作