Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
算法
O(n)
#include <iostream>
#include <vector>
#include<cmath>
#include <algorithm>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
void printList(ListNode* h){
while(h!=NULL){
cout<<h->val<<" "<<endl;
h=h->next;
}
cout<<endl;
}
ListNode* createList(int a[],int n){
ListNode* head=NULL, *p=NULL;
for(int i=0;i<n;i++){
if(head==NULL)
head=p=new ListNode(a[i]);
else{
p->next = new ListNode(a[i]);
p=p->next;
}
}
return head;
}
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode* fake=new ListNode(-1);
fake->next=head;
head=fake;
ListNode* tail=head;
bool dup=false;
for(ListNode* p=head->next; p && p->next;p=p->next){
if(dup==false && p->val==p->next->val){
dup = true;
continue;
}
if(dup==true && p->val!= p->next->val){
dup=false;
tail->next=p->next;
continue;
}
if(dup==false)
tail=p;
}
if(dup==true)
tail->next=NULL;
return head->next;
}
};
int main(int argc,char** argv){
Solution s;
int a[]={1,1,2,3,3};
int b[]={1,1,1};
int c[]={1,2,3};
int d[]={3};
printList(s.deleteDuplicates(createList(a,sizeof(a)/sizeof(int))));
printList(s.deleteDuplicates(createList(b,sizeof(b)/sizeof(int))));
printList(s.deleteDuplicates(createList(c,sizeof(c)/sizeof(int))));
printList(s.deleteDuplicates(createList(d,sizeof(d)/sizeof(int))));
return 0;
}