Sublist Search (Search a linked list in another list)

06 Jul, 2022
Given two linked lists, the task is to check whether the first list is present in 2nd list or not. 
Examples:
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
Algorithm: 
Take first node of second list. Start matching the first list from this first node. If whole lists match return true. Else break and take first list to the first node again. And take second list to its second node. Repeat these steps until any of linked lists becomes empty. If first list becomes empty then list found else not.
Take first node of second list. 
Start matching the first list from this first node. 
If whole lists match return true. 
Else break and take first list to the first node again. 
And take second list to its second node. 
Repeat these steps until any of linked lists becomes empty. 
If first list becomes empty then list found else not.
Below is the implementation.
C++
Java
Python3
C#
Javascript
// C++ program to find a list in second list#include <bits/stdc++.h>using namespace std; // A Linked List nodestruct Node{    int data;    Node* next;}; // Returns true if first list is present in second// listbool 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 listsNode *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 program to find a list in second listimport java.util.*;class GFG{ // A Linked List nodestatic class Node{    int data;    Node next;}; // Returns true if first list is// present in second liststatic 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 listsstatic Node newNode(int key){    Node temp = new Node();    temp.data= key;    temp.next = null;    return temp;} // Driver Codepublic 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 program to find a list in second listclass Node:    def __init__(self, value = 0):                 self.value = value        self.next = None # Returns true if first list is# present in second listdef 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->4node_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# program to find a list in second listusing System; class GFG{ // A Linked List nodeclass Node{    public int data;    public Node next;}; // Returns true if first list is// present in second liststatic 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 nodesin 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 listsstatic Node newNode(int key){    Node temp = new Node();    temp.data= key;    temp.next = null;    return temp;} // Driver Codepublic 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
<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>
LIST FOUND
Time Complexity: O(m*n) where m is the number of nodes in second list and n in first.
Optimization : 
Above code can be optimized by using extra space i.e. stores the list into two strings and apply KMP algorithm. Refer https://ide.geeksforgeeks.org/3fXUaV for implementation provided by Nishant Singh
This article is contributed by Sahil Chhabra (akku). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
princi singh
Rajput-Ji
GauriShankarBadola
GauravRajput1
simmytarika5
hardikkoriintern
Linked List
Searching
Linked List
Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Reverse a linked list
Stack Data Structure (Introduction and Program)
LinkedList in Java
Maximum and minimum of an array using minimum number of comparisons
K'th Smallest/Largest Element in Unsorted Array | Set 1
Search an element in a sorted and rotated array
Search, insert and delete in an unsorted array
Find the Missing Number