82. Remove Duplicates from Sorted List II【Medium】

82. Remove Duplicates from Sorted List II【Medium】

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.

解法一:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* deleteDuplicates(ListNode* head) {
12         if (head == NULL || head->next == NULL) {
13             return head;
14         }
15         
16         ListNode * dummy = new ListNode(INT_MIN);
17         dummy->next = head;
18         head = dummy;
19         int duplicate;
20         
21         while (head->next != NULL && head->next->next != NULL) {
22             if (head->next->val == head->next->next->val) {
23                 duplicate = head->next->val;
24                 while (head->next != NULL && head->next->val == duplicate) {
25                     ListNode * temp = head->next;
26                     free(temp);
27                     head->next = head->next->next;
28                 }
29             }
30             else {
31                 head = head->next;
32             }
33         }
34         return dummy->next;
35         
36     }
37 };

nc

解法二:

 1 class Solution {
 2 public:
 3     ListNode* deleteDuplicates(ListNode* head) {
 4         if(!head) return head;
 5         ListNode dummy(0);
 6         dummy.next = head;
 7         ListNode *pre = &dummy;
 8         ListNode *cur = head;
 9 
10         while(cur && cur->next){
11             while(cur->next && cur->val == cur->next->val) cur = cur->next;
12             if(pre->next == cur){
13                 pre = cur;
14                 cur = cur->next;
15             } else {
16                 cur = cur->next;
17                 pre->next = cur;
18             }
19         }
20 
21         return dummy.next;
22     }
23 };

参考了@liismn 的代码

解法三:

 1 class Solution {
 2 public:
 3     ListNode* deleteDuplicates(ListNode* head) {
 4         if(!head||!head->next) return head;
 5         ListNode* dummy = new ListNode(0);
 6         ListNode* tail = dummy;
 7         int flag = true; // should the current head be added ?
 8         while(head){
 9             while(head&&head->next&&head->val==head->next->val)
10             {
11                 flag = false; // finds duplicate, set it to false
12                 head = head->next;
13             }
14             if(flag) // if should be added
15             {
16                 tail->next = head;
17                 tail = tail->next;
18             }
19             head = head->next;
20             flag = true; // time for a new head value, set flag back to true
21         }
22         tail->next = nullptr; // Don't forget this... I did..
23         return dummy->next;
24     }
25 };

参考了@GoGoDong 的代码

解法四:

 1 public ListNode deleteDuplicates(ListNode head) {
 2     if (head == null) return null;
 3     
 4     if (head.next != null && head.val == head.next.val) {
 5         while (head.next != null && head.val == head.next.val) {
 6             head = head.next;
 7         }
 8         return deleteDuplicates(head.next);
 9     } else {
10         head.next = deleteDuplicates(head.next);
11     }
12     return head;
13 }

递归,参考了@totalheap 的代码,还不太明白

原文地址:https://www.cnblogs.com/abc-begin/p/7667587.html