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.
Test Cases
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]
Solution
C++
Java
/**
* 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 * prev = new ListNode ( 0 , head );
ListNode * curr = prev ;
while ( head != nullptr ) {
if ( head -> next != nullptr && head -> val == head -> next -> val ) {
while ( head -> next != nullptr && head -> val == head -> next -> val ) {
head = head -> next ;
}
curr -> next = head -> next ;
} else {
curr = curr -> next ;
}
head = head -> next ;
}
return prev -> next ;
}
};
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates ( ListNode head ) {
ListNode prev = new ListNode ( 0 , head );
ListNode curr = prev ;
while ( head != null ) {
if ( head . next != null && head . val == head . next . val ) {
while ( head . next != null && head . val == head . next . val ) {
head = head . next ;
}
curr . next = head . next ;
} else {
curr = curr . next ;
}
head = head . next ;
}
return prev . next ;
}
}
Time Complexity: O(n)
Space Complexity: O(1)