notes/OJ notes/pages/Leetcode Remove-Duplicates-From-Sorted-List.md
2022-07-07 21:24:34 +08:00

2.3 KiB

Leetcode Remove-Duplicates-From-Sorted-List

2022-06-16 14:21

Data structures:

#DS #linked_list

Difficulty:

#coding_problem #difficulty-easy

Additional tags:

#leetcode

Revisions:

Initial encounter: 2022-06-16 1st. revision: 2022-07-02

tag:#linked_list

Problem

Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.

Examples

Example 1:

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

Example 2:

Input: head = [1,1,2,3,3] Output: [1,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.

Thoughts

This can be implemented using recursion and iteration, like Leetcode Reverse-Linked-List. Recursion is not recommended, since it will take up O(n) space. In iteration, one pointer or 2 pointers can be used.

To understand the ptr->next->next = ptr->next, seeLeetcode Reverse-Linked-List#Solution

Solution

One pointer method

/**
 * 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) {
    ListNode *ptr = head;
    while (ptr != NULL && ptr->next != NULL) {
      if (ptr->val == ptr->next->val) {
        // Duplicate found
        auto tmp = ptr->next;
        ptr->next = ptr->next->next;
        delete tmp;
        // I done set ptr to ptr->next, in case new ptr->next is duplicated
      } else {
        ptr = ptr->next;
      }
    }
    return head;
  }
};