Skip to content
Related Articles

Related Articles

Find extra node in the second Linked list
  • Last Updated : 11 Jun, 2020
GeeksforGeeks - Summer Carnival Banner

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++




// 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;
}

Java




// 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);
    }
}

Python3




# 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)

C#




// 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
Output:
15

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :