82.Remove Duplicates from Sorted List II

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);
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章