在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
方法一,先对重复节点做标记,然后将有相同值的节点都删除。代码如下:
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
map<int,int> hash;
ListNode* p=pHead;
while(p!=NULL){
++hash[p->val];
p=p->next;
}
while(pHead!=NULL&&hash[pHead->val]>1){
pHead=pHead->next;
}
if(pHead==NULL){
return NULL;
}
ListNode* pre=pHead;
ListNode* pn=pre->next;
while(pn!=NULL){
if(hash[pn->val]>1){
pre->next=pn->next;
pn=pre->next;
}else{
pre=pn;
pn=pn->next;
}
}
return pHead;
}
};
方法二, 递归
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL){
return pHead;
}
if(pHead->val==pHead->next->val){
ListNode* current=pHead->next->next;
while(current!=NULL&&pHead->val==current->val){
current=current->next;
}
return deleteDuplication(current);
}else{
pHead->next=deleteDuplication(pHead->next);
return pHead;
}
}
};

被折叠的 条评论
为什么被折叠?



