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



京公网安备 11010502036488号