82. Remove Duplicates from Sorted List II
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.
其中,結點ListNode的 定義如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
這題與83. Remove Duplicates from Sorted List有一些小差別,都是有一個已經排好序的鏈表,83題是要我們刪除所有值重複的結點,使所有值只出現一次(1->1->2->3刪爲1->2->3),82題則是當一個值重複出現時,將全部值爲該值的結點全部刪去,只留全部不同的值的結點(1->1->2->3刪爲2->3)。
一種常見的思路爲,使用循環,依此對鏈表中的每個結點進行判斷和操作,當發現了一個值只出現了一次,把上一個只出現了一次的值的next指針指過來,指向新發現的只出現了一次的結點。如果沒有隻出現一次的結點,則返回一個NULL空指針。
爲了方便處理,在輸入的鏈表前面加了一個結點。參考代碼如下:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode* now = new ListNode(0);
ListNode* first = now;
now->next = head;
ListNode* next = head;
int count = 1;
while(next != NULL){
if(next->next == NULL || next->val != next->next->val){
if(count == 1) {
now->next = next;
now = now->next;
}
count = 1;
}
else {
count++;
}
next = next->next;
}
now->next = NULL;
return first->next;
}
};
但其實這個問題也可以嘗試使用遞歸來解決。使用循環略過所有重複的結點,當前不重複的結點的next指針指向遞歸求得的下一個不重複的結點。以後可以多考慮一下其他方法來解決問題。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
int val = head->val;
ListNode* temp = head->next;
if(temp->val != val) {
head->next = deleteDuplicates(temp);
return head;
}
else {
while(temp != NULL && temp->val == val)
temp = temp->next;
return deleteDuplicates(temp);
}
}
};