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
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}