Skip to content

LeetCode: 82-Remove Duplicates from Sorted List II 解題紀錄

Last Updated on 2022-03-09 by Clay

題目

Given the head of a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. Return the linked list sorted as well.

Example 1:

Input: head = [1,2,3,3,4,4,5]
Output: [1,2,5]

Example 2:

Input: head = [1,1,1,2,3]
Output: [2,3]

Constraints:

  • The number of nodes in the list is in the range [0, 300].
  • -100 <= Node.val <= 100
  • The list is guaranteed to be sorted in ascending order.

題目給定一組鏈結串列(linked-list)的資料,我們要把其中所有重複值的節點刪除(比方說 3 重複了兩次,就把所有 3 的節點全部刪掉)。


解題思路

當然,最簡單的方法還是把全部值用陣列儲存起來慢慢刪掉重複項…… 不過這樣空間複雜度應該比較糟糕一點。

想了很久,才發現這題可以用遞迴來解,我們只需要專注在處理跳過所有重複值的節點,所以每個當前值都要另外儲存起來。


複雜度

Time complexityO(n)
Space complexityO(1)


C++ 範例程式碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // Base case
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        
        // Init
        int currVal = head->val;
        ListNode* currNode = head->next;
        
        // Recursion
        if (currNode->val != currVal) {
            head->next = deleteDuplicates(currNode);
            return head;
        }
        else {
            while (currNode != nullptr && currNode->val == currVal) {
                currNode = currNode->next;                
            }
            
            return deleteDuplicates(currNode);
        }        
    }
};



兩節點 Python 範例程式碼

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # Base case
        if not head or not head.next:
            return head
        
        # Init
        currVal = head.val
        currNode = head.next
        
        # Recursion
        if currNode.val != currVal:
            head.next = self.deleteDuplicates(currNode)
            return head
        
        else:
            while currNode and currNode.val == currVal:
                currNode = currNode.next                
            
            return self.deleteDuplicates(currNode)

References


Read More

Leave a Reply