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.
Examples 🌟
🔹 Example 1:
Input:
Output:
🔹 Example 2:
Input:
Output:
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.
Solution 💡
To solve this problem, we need to identify and remove all nodes with duplicate values. Using a dummy node simplifies edge cases, especially when duplicates appear at the start of the list.
Java Solution
Explanation of the Solution
Dummy Node:
A dummy node is added at the beginning of the list to handle edge cases where the first few nodes are duplicates.
Traversing the List:
If a node and its next node have the same value, skip all nodes with that value.
Handling Duplicates:
Once duplicates are skipped, the prev pointer connects to the first non-duplicate node.
Returning the Result:
The new list starts from dummy.next.
Time Complexity ⏳
O(n): The entire list is traversed once.
Space Complexity 💾
O(1): The solution uses constant extra space.
Follow-up 🧐
This approach works efficiently without requiring additional data structures, maintaining the sorted property of the linked list.
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// Create a dummy node to simplify edge cases
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy; // Points to the last node in the result list
while (head != null) {
// If current node has duplicates
if (head.next != null && head.val == head.next.val) {
// Skip all nodes with the same value
while (head.next != null && head.val == head.next.val) {
head = head.next;
}
// Remove duplicates
prev.next = head.next;
} else {
// Move prev forward if no duplicates
prev = prev.next;
}
// Move head forward
head = head.next;
}
return dummy.next;
}
}