Búsqueda en sublistas (buscar una lista vinculada en otra lista)

Dadas dos listas vinculadas, la tarea es verificar si la primera lista está presente en la segunda lista o no. 

Ejemplos:

Input  : list1 =  10->20
         list2  = 5->10->20
Output : LIST FOUND

Input  : list1 =  1->2->3->4
         list2  = 1->2->1->2->3->4
Output : LIST FOUND

Input  : list1 =  1->2->3->4
         list2  = 1->2->2->1->2->3
Output : LIST NOT FOUND

Algoritmo: 

  1. Tome el primer Node de la segunda lista. 
  2. Comience a hacer coincidir la primera lista de este primer Node. 
  3. Si todas las listas coinciden, devuelve verdadero. 
  4. De lo contrario, rompa y lleve la primera lista al primer Node nuevamente. 
  5. Y lleva la segunda lista a su segundo Node. 
  6. Repita estos pasos hasta que cualquiera de las listas vinculadas quede vacía. 
  7. Si la primera lista se vuelve vacía, la lista no se encuentra.

A continuación se muestra la implementación.

C++

// C++ program to find a list in second list
#include <bits/stdc++.h>
using namespace std;
  
// A Linked List node
struct Node
{
    int data;
    Node* next;
};
  
// Returns true if first list is present in second
// list
bool findList(Node* first, Node* second)
{
    Node* ptr1 = first, *ptr2 = second;
  
    // If both linked lists are empty, return true
    if (first == NULL && second == NULL)
        return true;
  
    // Else If one is empty and other is not return
    // false
    if ( first == NULL ||
        (first != NULL && second == NULL))
        return false;
  
    // Traverse the second list by picking nodes
    // one by one
    while (second != NULL)
    {
        // Initialize ptr2 with current node of second
        ptr2 = second;
  
        // Start matching first list with second list
        while (ptr1 != NULL)
        {
            // If second list becomes empty and first
            // not then return false
            if (ptr2 == NULL)
                return false;
  
            // If data part is same, go to next
            // of both lists
            else if (ptr1->data == ptr2->data)
            {
                ptr1 = ptr1->next;
                ptr2 = ptr2->next;
            }
  
            // If not equal then  break the loop
            else break;
        }
  
        // Return true if first list gets traversed
        // completely that means it is matched.
        if (ptr1 == NULL)
            return true;
  
        // Initialize ptr1 with first again
        ptr1 = first;
  
        // And go to next node of second list
        second = second->next;
    }
  
    return false;
}
  
/* Function to print nodes in a given linked list */
void printList(Node* node)
{
    while (node != NULL)
    {
        printf("%d ", node->data);
        node = node->next;
    }
}
  
// Function to add new node to linked lists
Node *newNode(int key)
{
    Node *temp = new Node;
    temp-> data= key;
    temp->next = NULL;
    return temp;
}
  
/* Driver program to test above functions*/
int main()
{
    /* Let us create two linked lists to test
    the above functions. Created lists shall be
        a: 1->2->3->4
        b: 1->2->1->2->3->4*/
    Node *a = newNode(1);
    a->next = newNode(2);
    a->next->next = newNode(3);
    a->next->next->next = newNode(4);
  
    Node *b = newNode(1);
    b->next = newNode(2);
    b->next->next = newNode(1);
    b->next->next->next = newNode(2);
    b->next->next->next->next = newNode(3);
    b->next->next->next->next->next = newNode(4);
  
    findList(a,b) ? cout << "LIST FOUND" :
                    cout << "LIST NOT FOUND";
  
    return 0;
}

Java

// Java program to find a list in second list
import java.util.*;
class GFG 
{ 
  
// A Linked List node
static class Node 
{
    int data;
    Node next;
};
  
// Returns true if first list is 
// present in second list
static boolean findList(Node first,
                        Node second)
{
    Node ptr1 = first, ptr2 = second;
  
    // If both linked lists are empty,
    // return true
    if (first == null && second == null)
        return true;
  
    // Else If one is empty and 
    // other is not, return false
    if (first == null ||
       (first != null && second == null))
        return false;
  
    // Traverse the second list by 
    // picking nodes one by one
    while (second != null)
    {
        // Initialize ptr2 with 
        // current node of second
        ptr2 = second;
  
        // Start matching first list 
        // with second list
        while (ptr1 != null)
        {
            // If second list becomes empty and 
            // first not then return false
            if (ptr2 == null)
                return false;
  
            // If data part is same, go to next
            // of both lists
            else if (ptr1.data == ptr2.data)
            {
                ptr1 = ptr1.next;
                ptr2 = ptr2.next;
            }
  
            // If not equal then break the loop
            else break;
        }
  
        // Return true if first list gets traversed
        // completely that means it is matched.
        if (ptr1 == null)
            return true;
  
        // Initialize ptr1 with first again
        ptr1 = first;
  
        // And go to next node of second list
        second = second.next;
    }
    return false;
}
  
/* Function to print nodes in a given linked list */
static void printList(Node node)
{
    while (node != null)
    {
        System.out.printf("%d ", node.data);
        node = node.next;
    }
}
  
// Function to add new node to linked lists
static Node newNode(int key)
{
    Node temp = new Node();
    temp.data= key;
    temp.next = null;
    return temp;
}
  
// Driver Code
public static void main(String[] args) 
{
    /* Let us create two linked lists to test
    the above functions. Created lists shall be
        a: 1->2->3->4
        b: 1->2->1->2->3->4*/
    Node a = newNode(1);
    a.next = newNode(2);
    a.next.next = newNode(3);
    a.next.next.next = newNode(4);
  
    Node b = newNode(1);
    b.next = newNode(2);
    b.next.next = newNode(1);
    b.next.next.next = newNode(2);
    b.next.next.next.next = newNode(3);
    b.next.next.next.next.next = newNode(4);
  
    if(findList(a, b) == true) 
        System.out.println("LIST FOUND");
    else
        System.out.println("LIST NOT FOUND");
}
}
  
// This code is contributed by Princi Singh

Python3

# Python3 program to find a list in second list 
class Node:
    def __init__(self, value = 0):
          
        self.value = value
        self.next = None
  
# Returns true if first list is 
# present in second list 
def findList(first, second):
      
    # If both linked lists are empty/None,
    # return True
    if not first and not second:
        return True
  
    # If ONLY one of them is empty,
    # return False
    if not first or not second:
        return False
  
    ptr1 = first
    ptr2 = second
  
    # Traverse the second LL by 
    # picking nodes one by one
    while ptr2:
  
        # Initialize 'ptr2' with current
        # node of 'second'
        ptr2 = second
  
        # Start matching first LL 
        # with second LL
        while ptr1:
  
            # If second LL become empty and 
            # first not, return False,
            # since first LL has not been 
            # traversed completely
            if not ptr2:
                return False
  
            # If value of both nodes from both
            # LLs are equal, increment pointers
            # for both LLs so that next value 
            # can be matched
            else if ptr1.value == ptr2.value:
                ptr1 = ptr1.next
                ptr2 = ptr2.next
  
            # If a single mismatch is found
            # OR ptr1 is None/empty,break out
            # of the while loop and do some checks
            else:
                break
  
        # check 1 :
        # If 'ptr1' is None/empty,that means
        # the 'first LL' has been completely
        # traversed and matched so return True
        if not ptr1:
            return True
  
        # If check 1 fails, that means, some 
        # items for 'first' LL are still yet
        # to be matched, so start again by 
        # bringing back the 'ptr1' to point
        # to 1st node of 'first' LL
        ptr1 = first
          
        # And increment second node element to next
        second = second.next
          
    return False
  
# Driver Code
  
# Let us create two linked lists to
# test the above functions.
# Created lists would be be
# node_a: 1->2->3->4
# node_b: 1->2->1->2->3->4
node_a = Node(1)
node_a.next = Node(2)
node_a.next.next = Node(3)
node_a.next.next.next = Node(4)
  
node_b = Node(1)
node_b.next = Node(2)
node_b.next.next = Node(1)
node_b.next.next.next = Node(2)
node_b.next.next.next.next = Node(3)
node_b.next.next.next.next.next = Node(4)
  
if findList(node_a, node_b):
    print("LIST FOUND")
else:
    print("LIST NOT FOUND")
  
# This code is contributed by GauriShankarBadola

C#

// C# program to find a list in second list
using System;
  
class GFG 
{ 
  
// A Linked List node
class Node 
{
    public int data;
    public Node next;
};
  
// Returns true if first list is 
// present in second list
static Boolean findList(Node first,
                        Node second)
{
    Node ptr1 = first, ptr2 = second;
  
    // If both linked lists are empty,
    // return true
    if (first == null && second == null)
        return true;
  
    // Else If one is empty and 
    // other is not, return false
    if (first == null ||
       (first != null && second == null))
        return false;
  
    // Traverse the second list by 
    // picking nodes one by one
    while (second != null)
    {
        // Initialize ptr2 with 
        // current node of second
        ptr2 = second;
  
        // Start matching first list 
        // with second list
        while (ptr1 != null)
        {
            // If second list becomes empty and 
            // first not then return false
            if (ptr2 == null)
                return false;
  
            // If data part is same, go to next
            // of both lists
            else if (ptr1.data == ptr2.data)
            {
                ptr1 = ptr1.next;
                ptr2 = ptr2.next;
            }
  
            // If not equal then break the loop
            else break;
        }
  
        // Return true if first list gets traversed
        // completely that means it is matched.
        if (ptr1 == null)
            return true;
  
        // Initialize ptr1 with first again
        ptr1 = first;
  
        // And go to next node of second list
        second = second.next;
    }
    return false;
}
  
/* Function to print nodes
in a given linked list */
static void printList(Node node)
{
    while (node != null)
    {
        Console.Write("{0} ", node.data);
        node = node.next;
    }
}
  
// Function to add new node to linked lists
static Node newNode(int key)
{
    Node temp = new Node();
    temp.data= key;
    temp.next = null;
    return temp;
}
  
// Driver Code
public static void Main(String[] args) 
{
    /* Let us create two linked lists to test
    the above functions. Created lists shall be
        a: 1->2->3->4
        b: 1->2->1->2->3->4*/
    Node a = newNode(1);
    a.next = newNode(2);
    a.next.next = newNode(3);
    a.next.next.next = newNode(4);
  
    Node b = newNode(1);
    b.next = newNode(2);
    b.next.next = newNode(1);
    b.next.next.next = newNode(2);
    b.next.next.next.next = newNode(3);
    b.next.next.next.next.next = newNode(4);
  
    if(findList(a, b) == true) 
        Console.Write("LIST FOUND");
    else
        Console.Write("LIST NOT FOUND");
}
}
  
// This code is contributed by Rajput-Ji

Javascript

<script>
  
// JavaScript program to find a 
// list in second list
  
    // A Linked List node
    class Node {
    constructor() {
        this.data = 0;
        this.next = null;
    }
}
  
    // Returns true if first list is
    // present in second list
    function findList(first,  second) {
    var ptr1 = first, ptr2 = second;
  
        // If both linked lists are empty,
        // return true
        if (first == null && second == null)
            return true;
  
        // Else If one is empty and
        // other is not, return false
        if (first == null || (first != null &&
        second == null))
            return false;
  
        // Traverse the second list by
        // picking nodes one by one
        while (second != null) {
            // Initialize ptr2 with
            // current node of second
            ptr2 = second;
  
            // Start matching first list
            // with second list
            while (ptr1 != null) {
                // If second list becomes empty and
                // first not then return false
                if (ptr2 == null)
                    return false;
  
                // If data part is same, go to next
                // of both lists
                else if (ptr1.data == ptr2.data) {
                    ptr1 = ptr1.next;
                    ptr2 = ptr2.next;
                }
  
                // If not equal then break the loop
                else
                    break;
            }
  
            // Return true if first list gets traversed
            // completely that means it is matched.
            if (ptr1 == null)
                return true;
  
            // Initialize ptr1 with first again
            ptr1 = first;
  
            // And go to next node of second list
            second = second.next;
        }
        return false;
    }
  
    /* Function to print nodes in a given linked list */
    function printList(node) {
        while (node != null) {
            document.write("%d ", node.data);
            node = node.next;
        }
    }
  
    // Function to add new node to linked lists
    function newNode(key) {
        var temp = new Node();
        temp.data = key;
        temp.next = null;
        return temp;
    }
  
    // Driver Code
      
        /*
         Let us create two linked lists to test
         the above functions. Created lists
         shall be a: 1->2->3->4 b: 1->2->1->2->3->4
         */
        var a = newNode(1);
        a.next = newNode(2);
        a.next.next = newNode(3);
        a.next.next.next = newNode(4);
   
        var b = newNode(1);
        b.next = newNode(2);
        b.next.next = newNode(1);
        b.next.next.next = newNode(2);
        b.next.next.next.next = newNode(3);
        b.next.next.next.next.next = newNode(4);
  
        if (findList(a, b) == true)
            document.write("LIST FOUND");
        else
            document.write("LIST NOT FOUND");
  
// This code contributed by gauravrajput1
  
</script>
Producción

LIST FOUND

Complete Interview Preparation - GFG

Complejidad de tiempo: O(m*n) donde m es el número de Nodes en la segunda lista yn en la primera.

Optimización : 

El código anterior se puede optimizar utilizando espacio adicional, es decir, almacena la lista en dos strings y aplica el algoritmo KMP . Consulte https://ide.geeksforgeeks.org/3fXUaV para la implementación proporcionada por Nishant Singh

Echa un vistazo al curso de autoaprendizaje de DSA

Este artículo es una contribución de Sahil Chhabra (akku) . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *