https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/description/?envType=study-plan-v2&envId=top-interview-150
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head: return head
# create sentinel node
dummy = ListNode(0, head)
# prev_node, curr_node, next_node = dummy, head, head.next
prev_node, curr_node = dummy, head
while curr_node:
# if the current node's next exists and its current value
# is equal to its next value
if curr_node.next and curr_node.val == curr_node.next.val:
# while current node's next exists and its current value equals its
# next value, move current node forward
while curr_node.next and curr_node.val == curr_node.next.val:
curr_node = curr_node.next
# set prev node's next to be curr_node's next
# meaning you skip the non unique sublist completely
prev_node.next = curr_node.next
# if current node and its next node have different values
else:
# we move a unique value so move prev forward
# prev being at a node ensures that that node is unique
prev_node = prev_node.next
# move curr forward to continue processing
curr_node = curr_node.next
return dummy.next