首先考虑头结点重复,直接添加一个新结点 preHead 作为头结点

然后考虑重复,这里使用 temp 保存重复的值,通过对比重复的值来删除重复结点中的第一个

循环由删除有序链表中重复的元素-I修改而来

代码如下:

class Solution:
    def deleteDuplicates(self , head: ListNode) -> ListNode:
        if not head:
            return None
        
        preHead, p = ListNode(0), head
        pre = preHead
        pre.next = p
        
        temp = 0
        while p and p.next:
            if p.val == p.next.val:
                temp = p.val            # 记录重复的值
                p.next = p.next.next
            else:
                if p.val == temp:
                    pre.next = p.next
                else:
                    pre = p
                p = p.next
                
        if temp == p.val:               # 如果最后一个结点是重复结点
            pre.next = None
        
        return preHead.next