📜  在第二个链表中找到额外的节点

📅  最后修改于: 2021-09-06 06:00:35             🧑  作者: Mango

给定两个链表 L1 和 L2。第二个列表 L2 包含 L1 的所有节点以及 1 个额外节点。任务是找到那个额外的节点。
例子:

幼稚的方法:

  • 运行嵌套循环并在 L2 中找到 L1 中不存在的节点。
  • 这种方法的时间复杂度为 O(N 2 ),其中 N 是链表的长度。

有效的方法:

  • 如果 L1 和 L2 的所有节点都被异或在一起,那么 A[] 的每个节点都将给出 0 并在 L2 中出现,并且额外的元素说 X 当与 0 异或时将给出 (X XOR 0) = X,这是结果.

下面是上述方法的实现:

C++
// C++ program to find the 
// extra node
#include 
  
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


输出:
15

时间复杂度: O(N)
空间复杂度: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live