LeetCode(84)Remove Duplicates from Sorted List2

제목은 다음과 같습니다.
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.
분석은 다음과 같습니다.
이전 제목과 매우 유사하다.다른 것은 이 제목이 삭제한 요소가 더 많다는 것이다.비교적 오랫동안 썼다.일부 세부 사항을 이해하는 데 비교적 오랜 시간이 걸렸기 때문이다. 예를 들어 새로 생성된list의head가 비어 있을 때와head가 비어 있지 않을 때 처리 방식은 다르다.답을 보니 매우 교묘한 방법이 이 문제를 고려하는 것을 피하고 귀속을 사용할 수 있다는 것을 발견했다.
내 코드:
// 96ms 
/**
 * 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||head->next==NULL)
            return head;
        if((head!=NULL)&&(head->next!=NULL)&&(head->val==head->next->val)&&(head->next->next==NULL) )
            return NULL;
        else if((head!=NULL)&&(head->next!=NULL)&&(head->val!=head->next->val)&&(head->next->next==NULL))
            return head;
        ListNode* r=head; // 
        ListNode* p=head->next; // 
        ListNode* new_tail=NULL;
        ListNode* new_head=NULL;
        int flag=0;
        while(p!=NULL){
            flag=0;
            while(p!=NULL&&p->val==r->val){
                p=p->next;
                flag=1;
            }
            if((flag==0)&&(new_head==NULL)){
                new_head=r;
                new_tail=r;
            }else if((flag==0)&&(new_head!=NULL)){
                new_tail->next=r;
                new_tail=r;
            }
            r=p;
            if(p!=NULL){
                p=p->next;
            }
        }
        if(r!=NULL&&p==NULL) {
            if(new_head==NULL){
                new_head=r;
                new_tail=r;
            }else if(new_head!=NULL){
                new_tail->next=r;
                new_tail=r;
            }

        }
        if(new_tail!=NULL)
            new_tail->next=NULL;
        return new_head;
    }
};

우수 코드는 다음과 같습니다.
// ,28ms 
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *deleteDuplicates2(ListNode *head) {
        if(!head||!head->next)return head;
        ListNode *p=head->next;
        if(head->val==p->val)
        {
            while(head->val==p->val)
            {
                p=p->next;
                if(!p)break;
            }
            return deleteDuplicates(p);
        }
        head->next=deleteDuplicates(head->next);
        return head;
    }
};

참고 자료:
(1) http://discuss.leetcode.com/questions/257/remove-duplicates-from-sorted-list-ii
update:
2015-01-10
1 귀속 사용하지 않음
2 dummy 헤드 간소화 코드 설정
//22ms
class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL || head->next == NULL) return head;
        ListNode* dummy_head = new ListNode(-1);
        ListNode* tail = dummy_head;
        ListNode* node1 = head;
        ListNode* node2 = head->next;
        while (node1 != NULL && node2 != NULL ) {
            if (node1->val != node2->val) {
                tail->next = node1;
                tail = tail->next;
                node1 = node2;
                node2 = node2->next;
            } else {
                while(node1!= NULL && node1->val == node2->val) {
                    node1 = node1->next;
                }
                if (node1 != NULL) {
                    node2 = node1->next;
                }
            }
        }
        if (node1!= NULL && tail->val != node1->val) {
            tail->next = node1;
            tail = tail->next;
        }
        tail->next = NULL;
        return dummy_head->next;
    }
};

좋은 웹페이지 즐겨찾기