82. Remove Duplicates from Sorted List II
Medium
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.
 # Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head: # no element
            return head
        elif head.next == None: # 1 element
            return head
        elif head.next.next == None: # 2 elements
            if head.val == head.next.val:
                return None
            else:
                return head
        prev = head
        s_head = ListNode(0, prev)
        old = s_head
        node = prev.next
        delete = False
        while node:
            if prev.val == node.val:
                delete = True
                node = node.next
                if node == None:
                    old.next = None
            else:
                if delete:
                    old.next = node
                    prev = node
                    node = node.next
                    delete = False
                else:
                    old = prev
                    prev = node
                    node = node.next
        return s_head.next