题意:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表 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;//返回头结点 } };
时间复杂度:空间复杂度: