题目要求
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题解
https://github.com/soulmachine/leetcode
递归版
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head||!head->next) return head;
ListNode *p=head->next;
if(head->val==p->val){ // 出现重复的情况
while(p&&head->val==p->val){
p=p->next;
}
//跳出while时p指向重复的n个元素之后的第一个不同元素
delete head;
return deleteDuplicates(p); // 此时相当于从p的位置继续使用算法
}
else{
head->next=deleteDuplicates(head->next); // 不重复时相当于从下个元素开始继续算法
return head;
}
}
};
执行用时 | 内存消耗 |
---|---|
12 ms | 17.3 MB |
迭代版
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr) return head;
ListNode dummy(INT_MIN); //头结点
dummy.next=head;
ListNode *prev=&dummy,*cur=head;
while(cur!=nullptr){
bool duplicated=false;
while(cur->next!=nullptr&&cur->val==cur->next->val){
duplicated=true;
cur=cur->next;
} //此时cur指向的是相同元素中的最后一个
if(duplicated){ // 删除重复的最后一个元素
cur=cur->next; //指向与相同元素末尾的下一个元素
continue;
}
prev->next=cur; //上一个未被删除的元素->当前元素(不用被删除)
prev=prev->next;
cur=cur->next;
}
prev->next=cur; //最后一个元素指向nullptr 所以这句也可以写成 prev->next=nullptr;
return dummy.next;
}
};
执行用时 | 内存消耗 |
---|---|
12 ms | 9.2 MB |