Leetcode Remove Duplicates from Sorted List II 82

来源:互联网 发布:农行软件开发待遇 编辑:程序博客网 时间:2024/06/06 14:59

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.

Subscribe to see which companies asked this question

题目链接

gg在头节点改了很久 因为会出现[1,1,2,2,3]的情况

一:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* deleteDuplicates(ListNode* head) {        if(head==NULL) return head;        bool isdup=false;        while(1){            isdup=false;            while(head!=NULL && head->next!=NULL){                    if(head->val==head->next->val){                            head->next=head->next->next;                            isdup=true;                    }                    else{                            break;                    }            }            if(isdup) head=head->next;            else break;        }        if(head==NULL || head->next==NULL) {            return head;        }        ListNode *rf=head;        ListNode *r=rf->next;        ListNode *rc=rf->next->next;        isdup=false;        while(rf!=NULL && r!=NULL && rc!=NULL){                if(r->val==rc->val){                        isdup=true;                        r->next=rc->next;                        rc=r->next;                }                else{                        if(isdup){                                rf->next=rc;                                r=rf->next;                                rc=r->next;                                isdup=false;                        }                        else{                                rf=rf->next;                                r=rf->next;                                isdup=false;                                rc=r->next;                        }                }        }        if(isdup) rf->next=NULL;        //cout<<"isdup="<<isdup<<endl;        return head;    }};

二:
学习别人的,发现可以在头结点前加个结点,就可以一起处理了

学习了~

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* deleteDuplicates(ListNode* head) {        if(head==NULL) return head;        ListNode *p = new ListNode(-1);          p->next = head;        ListNode *rf=p;        ListNode *r=rf->next;        ListNode *rc=rf->next->next;        bool isdup=false;        while(rf!=NULL && r!=NULL && rc!=NULL){                if(r->val==rc->val){                        isdup=true;                        r->next=rc->next;                        rc=r->next;                }                else{                        if(isdup){                                rf->next=rc;                                r=rf->next;                                rc=r->next;                                isdup=false;                        }                        else{                                rf=rf->next;                                r=rf->next;                                isdup=false;                                rc=r->next;                        }                }        }        if(isdup) rf->next=NULL;        //cout<<"isdup="<<isdup<<endl;        return p->next;    }};
0 0