Find extra node in the second Linked list

Given two Linked list L1 and L2. The second list L2 contains all the nodes of L1 along with 1 extra node. The task is to find that extra node.
Examples:

Input: L1 = 17 -> 7 -> 6 -> 16
L2 = 17 -> 7 -> 6 -> 16 -> 15
Output: 15
Explanation:
Element 15 is not present in the L1 list

Input: L1 = 10 -> 15 -> 5
L2 = 10 -> 100 -> 15 -> 5
Output: 100

Naive approach:

  • Run nested loops and find the nodes in L2 which is not present in L1.
  • The time complexity of this approach will be O(N2) where N is the length of the linked list.

Efficient approach:



  • If all the nodes of the L1 and L2 are XORed together then every node of A[] will give 0 with its occurrence in L2 and the extra element say X when XORed with 0 will give (X XOR 0) = X which is the result.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the 
// extra node
#include <bits/stdc++.h>
  
using namespace std;
  
// Node of the singly linked 
// list
struct Node {
    int data;
    Node* next;
};
  
// Function to insert a node at 
// the beginning of the singly
// Linked List
void push(Node** head_ref,
          int new_data)
{
    // allocate node
    Node* new_node = 
    (Node*)malloc(sizeof
                  (struct Node));
  
    // put in the data
    new_node->data = new_data;
  
    // link the old list off the
    // new node
    new_node->next = (*head_ref);
  
    // move the head to point to 
    // the new node
    (*head_ref) = new_node;
}
  
int print(Node* head_ref,
          Node* head_ref1)
{
    int ans = 0;
  
    Node* ptr1 = head_ref;
    Node* ptr2 = head_ref1;
    // Traverse the linked list
    while (ptr1 != NULL) {
        ans ^= ptr1->data;
        ptr1 = ptr1->next;
    }
    while (ptr2 != NULL) {
        ans ^= ptr2->data;
        ptr2 = ptr2->next;
    }
    return ans;
}
  
// Driver program
int main()
{
    // start with the empty list
    Node* head1 = NULL;
    Node* head2 = NULL;
    // create the linked list
    // 15 -> 16 -> 7 -> 6 -> 17
    push(&head1, 17);
    push(&head1, 7);
    push(&head1, 6);
    push(&head1, 16);
  
    // second  LL
    push(&head2, 17);
    push(&head2, 7);
    push(&head2, 6);
    push(&head2, 16);
    push(&head1, 15);
    int k = print(head1, head2);
    cout << k;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the 
// extra node
class GFG {
    // Node of the singly
    // linked list
    static class Node {
        int data;
        Node next;
    };
  
    // Function to insert a node at 
    // the beginning of the singly
    // Linked List
    static Node push(Node head_ref,
                     int new_data)
    {
        // allocate node
        Node new_node = new Node();
  
        // put in the data
        new_node.data = new_data;
  
        // link the old list off
        // the new node
        new_node.next = (head_ref);
  
        // move the head to point
        // to the new node
        (head_ref) = new_node;
        return head_ref;
    }
  
    static void extra(Node head_ref1, 
                      Node head_ref2)
    {
        int ans = 0;
  
        Node ptr1 = head_ref1;
        Node ptr2 = head_ref2;
  
        // Traverse the linked list
        while (ptr1 != null) {
            ans ^= ptr1.data;
            ptr1 = ptr1.next;
        }
        while (ptr2 != null) {
            ans ^= ptr2.data;
            ptr2 = ptr2.next;
        }
  
        System.out.println(ans);
    }
  
    // Driver code
    public static void main(String args[])
    {
        // start with the empty list
        Node head1 = null;
        Node head2 = null;
        // create the linked list
        // 15 . 16 . 7 . 6 . 17
        head1 = push(head1, 17);
        head1 = push(head1, 7);
        head1 = push(head1, 6);
        head1 = push(head1, 16);
        head1 = push(head1, 15);
          
        // second LL
        head2 = push(head2, 17);
        head2 = push(head2, 7);
        head2 = push(head2, 6);
        head2 = push(head2, 16);
  
        extra(head1, head2);
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the 
# extra node
class Node:  
        
    def __init__(self, data):  
        self.data = data  
        self.next = next
            
# Function to insert a node at   
# the beginning of the singly 
# Linked List  
def push( head_ref, new_data) : 
    
    # allocate node  
    new_node = Node(0)  
    
    # put in the data  
    new_node.data = new_data  
    
    # link the old list off 
    # the new node  
    new_node.next = (head_ref)  
    
    # move the head to point
    # to the new node  
    (head_ref) = new_node 
    return head_ref 
    
  
def extra(head_ref1, head_ref2) : 
    
    ans = 0
    
    ptr1 = head_ref1  
    ptr2 = head_ref2
    # Traverse the linked list  
    while (ptr1 != None):
        # if current node is prime,  
        # Find sum and product  
        ans ^= ptr1.data
        ptr1 = ptr1.next
    while(ptr2 != None):
        ans^= ptr2.data
        ptr2 = ptr2.next
    print(ans)  
   ## print( "Product = ", prod)  
    
# Driver code  
    
# start with the empty list  
head1 = None
head2 = None 
# create the linked list  
# 15 . 16 . 7 . 6 . 17  
head1 = push(head1, 17)  
head1 = push(head1, 7)  
head1 = push(head1, 6)  
head1 = push(head1, 16)  
head1 = push(head1, 15)  
  
# create the linked list 
head2 = push(head2, 17)  
head2 = push(head2, 7)  
head2 = push(head2, 6)  
head2 = push(head2, 16)  
  
    
extra(head1, head2)

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the extra node
using System;
  
class GFG{
      
// Node of the singly
// linked list
class Node
{
    public int data;
    public Node next;
};
  
// Function to insert a node at 
// the beginning of the singly
// Linked List
static Node push(Node head_ref,
                 int new_data)
{
      
    // Allocate node
    Node new_node = new Node();
  
    // Put in the data
    new_node.data = new_data;
  
    // Link the old list off
    // the new node
    new_node.next = (head_ref);
  
    // Move the head to point
    // to the new node
    (head_ref) = new_node;
      
    return head_ref;
}
  
static void extra(Node head_ref1, 
                  Node head_ref2)
{
    int ans = 0;
  
    Node ptr1 = head_ref1;
    Node ptr2 = head_ref2;
  
    // Traverse the linked list
    while (ptr1 != null)
    {
        ans ^= ptr1.data;
        ptr1 = ptr1.next;
    }
    while (ptr2 != null
    {
        ans ^= ptr2.data;
        ptr2 = ptr2.next;
    }
    Console.WriteLine(ans);
}
  
// Driver code
public static void Main(String []args)
{
      
    // Start with the empty list
    Node head1 = null;
    Node head2 = null;
      
    // Create the linked list
    // 15 . 16 . 7 . 6 . 17
    head1 = push(head1, 17);
    head1 = push(head1, 7);
    head1 = push(head1, 6);
    head1 = push(head1, 16);
    head1 = push(head1, 15);
          
    // Second LL
    head2 = push(head2, 17);
    head2 = push(head2, 7);
    head2 = push(head2, 6);
    head2 = push(head2, 16);
  
    extra(head1, head2);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Output:

15

Time Complexity: O(N)
Space Complexity: O(1)

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Rajput-Ji