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.
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]
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.
Solutions
Solution 1: Single Pass
Thinking
The first idea is count frequencies, then rebuild a list of values that appear once. Correct, and \(n \le 300\) is tiny, but that wastes “already sorted, so duplicates are adjacent” and uses extra \(O(n)\) space.
The bottleneck is not using adjacency. Equal values form a contiguous run; one pass decides whether the whole run stays.
The head may be deleted, so we need a dummy. And when a run is dropped, the predecessor must not advance into it. Keep \(pre\) on the last kept node and slide \(cur\) over the current value: if \(pre.next\) is still \(cur\), the run has length one and \(pre\) moves; otherwise skip the whole run.
First, we create a dummy head node \(dummy\), and set \(dummy.next = head\). Then we create a pointer \(pre\) pointing to \(dummy\), and a pointer \(cur\) pointing to \(head\), and start traversing the linked list.
When the node value pointed by \(cur\) is the same as the node value pointed by \(cur.next\), we let \(cur\) keep moving forward until the node value pointed by \(cur\) is different from the node value pointed by \(cur.next\). At this point, we check whether \(pre.next\) is equal to \(cur\). If they are equal, it means there are no duplicate nodes between \(pre\) and \(cur\), so we move \(pre\) to the position of \(cur\); otherwise, it means there are duplicate nodes between \(pre\) and \(cur\), so we set \(pre.next\) to \(cur.next\). Then we continue to move \(cur\) forward. Continue the above operation until \(cur\) is null, and the traversal ends.
Finally, return \(dummy.next\).
The time complexity is \(O(n)\), and the space complexity is \(O(1)\). Here, \(n\) is the length of the linked list.
1 2 3 4 5 6 7 8 9101112131415161718
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defdeleteDuplicates(self,head:Optional[ListNode])->Optional[ListNode]:dummy=pre=ListNode(next=head)cur=headwhilecur:whilecur.nextandcur.next.val==cur.val:cur=cur.nextifpre.next==cur:pre=curelse:pre.next=cur.nextcur=cur.nextreturndummy.next
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */funcdeleteDuplicates(head*ListNode)*ListNode{dummy:=&ListNode{Next:head}pre,cur:=dummy,headforcur!=nil{forcur.Next!=nil&&cur.Next.Val==cur.Val{cur=cur.Next}ifpre.Next==cur{pre=cur}else{pre.Next=cur.Next}cur=cur.Next}returndummy.Next}