Example 1
Input: list1 = 1 → 2 → 4 , list2 = 1 → 3 → 4
Output: 1 → 2 → 3 → 4
Example 2
Input: list1 = [], list2 = []
Output: []
Example 3
Input: list1 = [], list2 = [0]
Output: [0]
Merge two sorted lists, then remove duplicates public class MergeTwoSortedListsRemoveDuplicates { static class ListNode { int element; ListNode next; public ListNode(int element) { this.element = element; } } public ListNode mergeAndRemoveDuplicates(ListNode list1, ListNode list2) { ListNode result = merge(list1, list2); removeDuplicates(result); return result; } public ListNode merge(ListNode list1, ListNode list2) { ListNode result = new ListNode(0); ListNode temp = result; while(list1!=null || list2!=null) { if(list1 == null) { temp.next = list2; break; } if(list2 == null){ temp.next = list1; break; } if(list1.element <= list2.element) { temp.next = new ListNode(list1.element); list1 = list1.next; } else if (list1.element > list2.element) { temp.next = new ListNode(list2.element); list2 = list2.next; } temp = temp.next; } return result.next; } public void removeDuplicates(ListNode linkedList) { ListNode current = linkedList; // pointer to current head while(current.next != null) { if(current.element == current.next.element) { current.next = current.next.next; } else { current = current.next; } } } }
Complexity Analysis:

Above code runs in O(m + n) time complexity where m is the size of the input list1 and n is the size of the input list2, as we are looping through the input lists one time for merge process and one more time for removing duplicates. Space complexity is O(n) that is taken by the result list.

Remove duplicates while merging the lists public class MergeTwoSortedListsRemoveDuplicates { static class ListNode { int element; ListNode next; public ListNode(int element) { this.element = element; } } public ListNode removeDuplicatesWhileMerging(ListNode list1, ListNode list2) { ListNode result = new ListNode(0);// create a new ListNode with a dummy head ListNode temp = result; int counter=0; while(list1 != null || list2 != null) { if( (list1 != null && list2 != null && list1.element <= list2.element) || (list2 == null)) { if(counter == 0 || (list1!=null && temp.element != list1.element)) { temp.next = new ListNode(list1.element); } list1 = list1.next; } else if( (list1 != null && list2 != null && list1.element > list2.element) || (list1 == null)) { if(counter == 0 || (list2 != null && temp.element != list2.element)) { temp.next = new ListNode(list2.element); } list2 = list2.next; } counter++; if(temp.next != null) { temp = temp.next; } } return result.next; } }
Complexity Analysis:

Above code runs in O(m + n) time complexity where m is the size of the input list1 and n is the size of the input list2, as we are looping through the input lists only once. Space complexity is O(n) that is taken by the result list.

Above examples source code can be found at GitHub link for Java code and JUnit tests can be found at GitHub link for Unit tests code

Similar Articles

  1. Merge Two Sorted Linked Lists