Diferencia de dos listas vinculadas utilizando la ordenación por combinación

Dadas dos Listas Vinculadas, la tarea es crear una Lista Vinculada para almacenar la diferencia de la Lista Vinculada 1 con la Lista Vinculada 2, es decir, los elementos presentes en la Lista 1 pero no en la Lista 2.
Ejemplos: 
 

Entrada: 
List1: 10 -> 15 -> 4 ->20, 
List2: 8 -> 4 -> 2 -> 10 
Salida: 15 -> 20 
Explicación: 
En la lista enlazada dada, los elementos 15 y 20 están presentes en la lista 1 pero no en la lista 2.
Entrada: 
List1: 2 -> 4 -> 8 -> 10, 
List2: 8 -> 10 
Salida: 2 -> 4 
Explicación: 
En la lista enlazada dada, los elementos 2 y 4 están presentes en la lista 1 pero no en la lista 2. 
 

Acercarse: 
 

  • Ordene ambas listas vinculadas utilizando la ordenación por combinación.
  • Escanee linealmente ambas listas ordenadas para obtener la diferencia con dos punteros en p1 y p2 y compare los datos de los Nodes en la lista vinculada y realice lo siguiente en los siguientes tres casos: 
    1. Si p1.data == p2.data entonces, p1.data no puede estar en la lista de diferencias, así que mueva los punteros p1 y p2 adelante.
    2. Si p1.data > p2.data entonces, p1.data puede estar presente en la lista 2 en más Nodes, así que mueva el puntero p2 adelante.
    3. Si p1.data > p2.data entonces, p1.data no puede estar presente en la lista 2 ahora, así que agregue los datos de p1 en la lista de diferencias y mueva el puntero p1 adelante.
  • Si se llega al final de la lista 2, inserte todos los elementos restantes de la lista 1 en la lista de diferencias.

A continuación se muestra la implementación del enfoque anterior.
 

Python3

# Python implementation to create
# a difference Linked List of
# two Linked Lists
 
# Node of the Linked List
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Linked List
class linked_list:
    def __init__(self):
        self.head = None
     
    # Function to insert a node
    # at the end of Linked List
    def append(self, data):
        temp = Node(data)
        if self.head == None:
            self.head = temp
        else:
            p = self.head
            while p.next != None:
                p = p.next
            p.next = temp
 
    # Function to find the middle
    # node of the Linked List
    def get_mid(self, head):
        if head == None:
            return head
        slow = fast = head
        while fast.next != None \
           and fast.next.next != None:
            slow = slow.next
            fast = fast.next.next
        return slow
 
    # Recursive method to merge the
    # two half after sorting
    def merge(self, l, r):
        if l == None:return r
        if r == None:return l
 
        if l.data<= r.data:
            result = l
            result.next = \
                self.merge(l.next, r)
        else:
            result = r
            result.next = \
                self.merge(l, r.next)
        return result
 
    # Recursive method to divide the
    # list into two half until 1 node left
    def merge_sort(self, head):
        if head == None or head.next == None:
            return head
        mid = self.get_mid(head)
        next_to_mid = mid.next
        mid.next = None
        left = self.merge_sort(head)
        right = self.merge_sort(next_to_mid)
        sorted_merge = self.merge(left, right)
        return sorted_merge
 
    # Function to print the list elements
    def display(self):
        p = self.head
        while p != None:
            print(p.data, end =' ')
            p = p.next
        print()
 
# Function to get the difference list
def get_difference(p1, p2):
    difference_list = linked_list()
    # Scan the lists
    while p1 != None and p2 != None:
         
        # Condition to check if the
        # Data of the both pointer are
        # same then move ahead
        if p2.data == p1.data:
            p1 = p1.next
            p2 = p2.next
         
        # Condition to check if the
        # Data of the first pointer is
        # greater than second then
        # move second pointer ahead
        elif p2.data<p1.data:
            p2 = p2.next
         
        # Condition when first pointer
        # data is greater than the
        # second pointer then append
        # into the difference list and move
        else:
            difference_list.append(p1.data)
            p1 = p1.next
 
    # If end of list2 is reached,
    # there may be some nodes in
    # List 1 left to be scanned,
    # they all will be inserted
    # in the difference list
    if p2 == None:
        while p1:
            difference_list.append(p1.data)
            p1 = p1.next
 
    return difference_list
 
# Driver Code
if __name__ == '__main__':
    # Linked List 1
    list1 = linked_list()
    list1.append(2)
    list1.append(6)
    list1.append(8)
    list1.append(1)
     
    # Linked List 2
    list2 = linked_list()
    list2.append(4)
    list2.append(1)
    list2.append(9)
     
    # Sort both the linkedlists
    list1.head = list1.merge_sort(
                   list1.head
                 )
    list2.head = list2.merge_sort(
                   list2.head
                 )
     
    # Get difference list
    result = get_difference(
               list1.head, list2.head
             )
    if result.head:
        result.display()
     
    # if difference list is empty,
    # then lists are equal
    else:
        print('Lists are equal')
Producción: 

2 6 8

 

Complejidad temporal: O(M Log M + N Log N).
 

Publicación traducida automáticamente

Artículo escrito por naina024 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *