Remove Duplicates from Sorted List

Given the HEAD of the Sorted Linked List. delete all duplicates such that each element appears only once. Return the Head of the Modified Linked List.
Assets/Leetcode/LinkedList/remove_diplicates_from_list/1.png
So the output will look like [1]->[2]->[3]. Let's initialize our curr pointer starting from the HEAD.

Intuition

Assets/Leetcode/LinkedList/remove_diplicates_from_list/2.pngAs we can see we have placed the curr pointer at the HEAD and automatically curr.next is the Node next to it. So we need to compare the current node values and next node value every time until all the duplicate nodes got removed. Let's take a sneak peak of the initialization code.

# 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]:
		curr = head

But if the HEAD is NULL or there is only one node in the Linked List, we need to return the HEAD without any further operation. Let's get the code-template ready.

class Solution:
	def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
		curr = head
		while curr and curr.next:
			pass
		return head

Now Let's find the duplicate nodes and start removing them iteratively.
Assets/Leetcode/LinkedList/remove_diplicates_from_list/3.png

while curr and curr.next:
	# if current node value and next node value is equal
	if curr.val == curr.next.val:
		# Linking with the next of the next node
		curr.next = curr.next.next

Assets/Leetcode/LinkedList/remove_diplicates_from_list/4.png
Now you can see the value of curr node and curr.next node is not equal. Now the curr pointer will move forward to it's next node.
Assets/Leetcode/LinkedList/remove_diplicates_from_list/5.png

while curr and curr.next:
	# if current node value and next node value is equal
	if curr.val == curr.next.val:
		# Linking with the next of the next node
		curr.next = curr.next.next
	else:
		# moving curr pointer to it's next pointer
		curr = curr.next

Let's visualize the rest of the iterations
Assets/Leetcode/LinkedList/remove_diplicates_from_list/6.png
Now the curr.next has reached to NULL and break out of the while loop. The output will look like this
Assets/Leetcode/LinkedList/remove_diplicates_from_list/7.png
Let's see the complete code snippet bellow.

Complete Code Snippet

class Solution:
	def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
		curr = head
		while curr and curr.next:
			if curr.val == curr.next.val:
				curr.next = curr.next.next
			else:
				curr = curr.next
		return head


Thanks for Stopping by! Happy Leet coding

Connect with me on

Github LinkedIn Gmail Youtube