给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解法1:双指针定位
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode*p = new ListNode(0);
if(head == NULL || head->next == NULL){
return head;
}
p->next = head;
head = p;
ListNode *ptr1, *ptr2;
while(p->next){
ptr1 = p->next;
ptr2 = ptr1;
while(ptr2->next && ptr2->next->val == ptr1->val){
ptr2 = ptr2->next;
}
if(ptr1 == ptr2){
p = p->next;
}
else{
p->next = ptr2->next;
}
}
return head->next;
}
};
解法2:递归调用
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL || head->next == NULL){
return head;
}
ListNode* head_next = head->next;
if(head->val == head_next->val){
while(head_next != NULL && head_next->val == head->val){
head_next = head_next->next;
}
head = deleteDuplicates(head_next); //此时的head为重复节点,被抛弃
}else{
head->next = deleteDuplicates(head_next); //递归返回的节点作为head的子节点
}
return head;
}
};