题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
思路1:
用一个set来记录重复的结点
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
set<int> s;
ListNode* p=pHead;
while (p->next)
{
if (p->val==p->next->val)
s.insert(p->val);
p=p->next;
}
ListNode* new_pHead=new ListNode(-1);//这个操作主要是为了防止第一个就是重复的,因此把头结点延长一个
new_pHead->next=pHead;
p=pHead;
ListNode* np=new_pHead;
while (p)
{
if (s.count(p->val))//如果当前值在set里出现了,就跳一个
{
p=p->next;
np->next=p;
}
else//否则两个指针同时移动
{
np=np->next;
p=p->next;
}
}
return new_pHead->next;//返回延长头结点的下一个
}
};
思路2:不使用额外的空间来实现
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
ListNode* new_pHead=new ListNode(-1);//同样延长头结点,防止第一个就重复
new_pHead->next=pHead;
ListNode* np=new_pHead;
ListNode* p=pHead;
while(p)
{
if (p->next&&p->val==p->next->val)
{
//出现相等的时候一直往后跳
while (p->next&&p->val==p->next->val)
p=p->next;
p=p->next;//再跳一格(因为对于例如3334的时候,最后一个3和4不相等,此时退出了上面的循环,p为3,是重复的,还需要再往后面移动以下)
np->next=p;
}
else
{
np=np->next;
p=p->next;
}
}
return new_pHead->next;
}
};