# Leetcode Remove-Duplicates-From-Sorted-List

#### 2022-06-16 14:21

> ##### Data structures:
>
> #DS #linked_list
>
> ##### Difficulty:
>
> #coding_problems #difficulty_easy
>
> ##### Additional tags:
>
> #leetcode
>
> ##### Revisions:
>
> Initial encounter: 2022-06-16
> 1st. revision: 2022-07-02

##### Related topics:

##### Links:

- [Link to problem](https://leetcode.com/problems/remove-duplicates-from-sorted-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:**

![](https://assets.leetcode.com/uploads/2021/01/04/list1.jpg)

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

**Example 2:**

![](https://assets.leetcode.com/uploads/2021/01/04/list2.jpg)

**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, see[[Leetcode Reverse-Linked-List]] solution

### Solution

One pointer method

```cpp
/**
 * 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;
}
};
```
