Home > Net >  Remove duplicate in merge sort of linked lists
Remove duplicate in merge sort of linked lists

Time:04-04

I have made a method that merge sorts two linked lists in descending order. I am now having difficulty in removing duplicates. I have seen some remove duplicate methods but I want to implement in within my mergesort method and not create a new method. What should I add in my mergesort method in order to remove the duplicates in the output? Thanks in advance!

Expected Output

Input1: 90 90 20 30 
Input2: 3 1 3 2 1 3
Output: 90 30 20 3 2 1

My Output

Input1: 90 90 20 30 
Input2: 3 1 3 2 1 3
Output: 90 90 30 20 3 3 3 2 1 1 

This is my method to merge sort the two linked lists in descending order. Not sure if this is the part where the duplication is being handled but I have marked it anyway.

public SLLNode<T> mergesort(SLLNode<T> n1, SLLNode<T> n2) 
    {  
       SLLNode<T> merged = null; // pointer for merged list  
       SLLNode<T> current = null; // head of merged list  

       if (n1 == null)  
            return n2;  
       if (n2 == null)  
            return n1;  
        

       int cmp = 0;  
       while (n1 != null && n2 != null) 
       {  
            cmp = n2.compareTo(n1);  
            if (merged == null) {  
                 if (cmp < 0) {  
                      merged = n1;  
                      n1 = n1.next;  
                 } 
                 else if (cmp == 0)
                 {
                    // ****handles the duplicate****
                 }
                 else {  
                      merged = n2;  
                      n2 = n2.next;  
                 }  
                 current = merged; // points to head of merged list
            } 
            
            else {  
                 if (cmp < 0) {  
                      merged.next = n1;  
                      n1 = n1.next;  
                      merged = merged.next; 
                    }
                 else if (cmp == 0)
                 {
                    // ****handles the duplicate****
                 }
                  else {  
                      merged.next = n2;  
                      n2 = n2.next;  
                      merged = merged.next;  
                 }  
            }  
       }

       // append the remaining nodes of the either list  
       if (n1 == null)  
            merged.next = n2;  
       else  
            merged.next = n1;  

       return current;  
    } 

Main Method

System.out.println("Output:");
SLL<Integer> mergedList = new SLL<>(); 
mergedList.head = mergedList.mergesort(list1.head, list2.head);  
mergedList.print(mergedList.head); 

Edit

Updated mergesort

    public SLLNode<T> mergesort(SLLNode<T> n1, SLLNode<T> n2) 
    {  
        SLLNode<T> merged = null; // pointer for merged list  
        SLLNode<T> current = null; // head of merged list  

        if (n1 == null)
            return n2; 
        
        if (n2 == null) 
            return n1;  

        int cmp = 0;  
        while (n1 != null && n2 != null) 
        {  
            cmp = n2.compareTo(n1);  
            if (merged == null) 
            {  
                if (cmp < 0) 
                {  
                    merged = n1;  
                    n1 = n1.next;  
                } 
                else 
                {  
                    merged = n2;  
                    n2 = n2.next;
                }  
                current = merged; // points to head of merged list
            } 
            
            else 
            {  
                if (cmp < 0) 
                {
                    if (merged.compareTo(n1) != 0) 
                    {
                        merged.next = n1;
                        merged = merged.next;
                    }
                    n1 = n1.next;
                } 
                else if (cmp == 0) // handles the duplicate
                {
                    if (merged.compareTo(n1) != 0) 
                    {
                       merged = n1;
                       merged = merged.next;
                    }
                    n1 = n1.next;
                    n2 = n2.next;
                } 
                else 
                {
                    if (merged.compareTo(n2) != 0) 
                    {
                        merged.next = n2;
                        merged = merged.next;
                    }
                    n2 = n2.next;
                }
            }  
        }
        
       // append the remaining nodes of the either list  
       while (n2 != null) 
       {
            if (merged.compareTo(n2) != 0) 
            {
                merged.next = n2;
                merged = merged.next;
            }
            n2 = n2.next;
        }
        
        while (n1 != null) 
        {
            if (merged.compareTo(n1) != 0) 
            {
                merged.next = n1;
                merged = merged.next;
            }
            n1 = n1.next;
        }
        merged.next = null; 

        return current;
    } 

SLLNode Class

public class SLLNode <T extends Comparable<T>> 
{
    public T info;
    public SLLNode<T> next;
    
    public SLLNode(T el) 
    {
        info = el;
        next = null;
    }
    
    public SLLNode(T el, SLLNode<T> ptr)
    {
        info = el;
        next = ptr;
    }
    
    public int compareTo(SLLNode<T> ptr) 
    {  
        return this.info.compareTo(ptr.info);  
    }  
    
    public String toString()
    {
        return this.info.toString();
    }
}

CodePudding user response:

Your logic will only work if the 2 input lists are already sorted. Assuming they are, to remove duplicates in your code you can compare merged and (n1 or n2) before updating merged.next. Also in the end rather than directly updating merged.next = n1 you will have to traverse through n1 and compare merged with n1. You can also used equals instead of merged.compareTo(n1). The below code can be used in the else block of merged==null. else if (cmp == 0) is not required when merged == null as it does not matter if n1 or n2 is set when they are equal.

if (cmp < 0) {
    if (merged.compareTo(n1) != 0) {
        merged.next = n1;
        merged = merged.next;
    }
    n1 = n1.next;
} else if (cmp == 0) {
    // ****handles the duplicate****
    if (merged.compareTo(n1) != 0) {
       merged = n1;
       merged = merged.next;
    }
    n1 = n1.next;
    n2 = n2.next;
} else {
    if (merged.compareTo(n2) != 0) {
        merged.next = n2;
        merged = merged.next;
    }
    n2 = n2.next;
}

The last part can be replaced with

while (n2 != null) {
    if (merged.compareTo(n2) != 0) {
        merged.next = n2;
        merged = merged.next;
    }
    n2 = n2.next;
}
while (n1 != null) {
    if (merged.compareTo(n1) != 0) {
        merged.next = n1;
        merged = merged.next;
    }
    n1 = n1.next;
}
merged.next = null;
  • Related