2.3 KiB
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
Related topics:
tag:#linked_list
- Floyd's Cycle Finding Algorithm
- Leetcode Linked-List-Cycle
- Leetcode Merge-Two-Sorted-Lists
- Leetcode Remove-Linked-List-Elements
- Leetcode Reverse-Linked-List
- Two pointers approach
Links:
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;
}
};