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



京公网安备 11010502036488号