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 of 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 |
Javascript
<script> // Javascript program to find the // extra node // Node of the singly linked // list class Node { constructor()
{
this .data = 0;
this .next = null ;
}
}; // Function to insert a node at // the beginning of the singly // Linked List function push(head_ref, new_data)
{ // allocate node
var new_node = new Node();
// put in the data
new_node.data = new_data;
// link the old list of the
// new node
new_node.next = (head_ref);
// move the head to point to
// the new node
(head_ref) = new_node;
return head_ref;
} function print(head_ref, head_ref1)
{ var ans = 0;
var ptr1 = head_ref;
var 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 // start with the empty list var head1 = null ;
var 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); // second LL head2 = push(head2, 17); head2 = push(head2, 7); head2 = push(head2, 6); head2 = push(head2, 16); head1 = push(head1, 15); var k = print(head1, head2);
document.write( k); // This code is contributed by noob2000. </script> |
Output:
15
Time Complexity: O(N)
Space Complexity: O(1)
Recommended Articles