Create a linked list from two linked lists by choosing max element at each position

Given two linked list of equal sizes, the task is to create new linked list using those linked lists where at every step, the maximum of the two elements from both the linked lists is chosen and the other is skipped.

Examples:

Input:
list1 = 5 -> 2 -> 3 -> 8 -> NULL
list2 = 1 -> 7 -> 4 -> 5 -> NULL
Output: 5 -> 7 -> 4 -> 8 -> NULL

Input:
list1 = 2 -> 8 -> 9 -> 3 -> NULL
list2 = 5 -> 3 -> 6 -> 4 -> NULL
Output: 5 -> 8 -> 9 -> 4 -> NULL

Approach: We traverse both the linked list at the same time and compare node from both the lists. The node which is greater among them, will be added to the new linked list. We do this for each node and then print the nodes of the generated linked list.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <iostream>
using namespace std;
  
// Representation of node
struct Node {
    int data;
    Node* next;
};
  
// Function to insert node in a linked list
void insert(Node** root, int item)
{
    Node *ptr, *temp;
    temp = new Node;
    temp->data = item;
    temp->next = NULL;
  
    if (*root == NULL)
        *root = temp;
    else {
        ptr = *root;
        while (ptr->next != NULL)
            ptr = ptr->next;
  
        ptr->next = temp;
    }
}
  
// Function to print the
// nodes of a linked list
void display(Node* root)
{
    while (root != NULL) {
        cout << root->data << " -> ";
        root = root->next;
    }
    cout << "NULL";
}
  
// Function to generate the required
// linked list and return its head
Node* newList(Node* root1, Node* root2)
{
    Node *ptr1 = root1, *ptr2 = root2;
    Node* root = NULL;
  
    // While there are nodes left
    while (ptr1 != NULL) {
  
        // Maximum node at current position
        int currMax = ((ptr1->data < ptr2->data)
                           ? ptr2->data
                           : ptr1->data);
  
        // If current node is the first node
        // of the newly linked list being
        // generated then assign it to the root
        if (root == NULL) {
            Node* temp = new Node;
            temp->data = currMax;
            temp->next = NULL;
            root = temp;
        }
  
        // Else insert the newly
        // created node in the end
        else {
            insert(&root, currMax);
        }
  
        // Get to the next nodes
        ptr1 = ptr1->next;
        ptr2 = ptr2->next;
    }
  
    // Return the head of the
    // generated linked list
    return root;
}
  
// Driver code
int main()
{
    Node *root1 = NULL, *root2 = NULL, *root = NULL;
  
    // First linked list
    insert(&root1, 5);
    insert(&root1, 2);
    insert(&root1, 3);
    insert(&root1, 8);
  
    // Second linked list
    insert(&root2, 1);
    insert(&root2, 7);
    insert(&root2, 4);
    insert(&root2, 5);
  
    // Generate the new linked list
    // and get its head
    root = newList(root1, root2);
  
    // Display the nodes of the generated list
    display(root);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
class GFG
{
  
// Representation of node
static class Node 
{
    int data;
    Node next;
};
  
// Function to insert node in a linked list
static Node insert(Node root, int item)
{
    Node ptr, temp;
    temp = new Node();
    temp.data = item;
    temp.next = null;
  
    if (root == null)
        root = temp;
    else 
    {
        ptr = root;
        while (ptr.next != null)
            ptr = ptr.next;
  
        ptr.next = temp;
    }
    return root;
}
  
// Function to print the
// nodes of a linked list
static void display(Node root)
{
    while (root != null
    {
        System.out.print( root.data + " - > ");
        root = root.next;
    }
    System.out.print("null");
}
  
// Function to generate the required
// linked list and return its head
static Node newList(Node root1, Node root2)
{
    Node ptr1 = root1, ptr2 = root2;
    Node root = null;
  
    // While there are nodes left
    while (ptr1 != null
    {
  
        // Maximum node at current position
        int currMax = ((ptr1.data < ptr2.data)
                        ? ptr2.data
                        : ptr1.data);
  
        // If current node is the first node
        // of the newly linked list being
        // generated then assign it to the root
        if (root == null
        {
            Node temp = new Node();
            temp.data = currMax;
            temp.next = null;
            root = temp;
        }
  
        // Else insert the newly
        // created node in the end
        else 
        {
            root = insert(root, currMax);
        }
  
        // Get to the next nodes
        ptr1 = ptr1.next;
        ptr2 = ptr2.next;
    }
  
    // Return the head of the
    // generated linked list
    return root;
}
  
// Driver code
public static void main(String args[])
{
    Node root1 = null, root2 = null, root = null;
  
    // First linked list
    root1 = insert(root1, 5);
    root1 = insert(root1, 2);
    root1 = insert(root1, 3);
    root1 = insert(root1, 8);
  
    // Second linked list
    root2 = insert(root2, 1);
    root2 = insert(root2, 7);
    root2 = insert(root2, 4);
    root2 = insert(root2, 5);
  
    // Generate the new linked list
    // and get its head
    root = newList(root1, root2);
  
    // Display the nodes of the generated list
    display(root);
  
}
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System; 
  
class GFG 
  
// Representation of node 
public class Node 
    public int data; 
    public Node next; 
}; 
  
// Function to insert node in a linked list 
static Node insert(Node root, int item) 
    Node ptr, temp; 
    temp = new Node(); 
    temp.data = item; 
    temp.next = null
  
    if (root == null
        root = temp; 
    else
    
        ptr = root; 
        while (ptr.next != null
            ptr = ptr.next; 
  
        ptr.next = temp; 
    
    return root; 
  
// Function to print the 
// nodes of a linked list 
static void display(Node root) 
    while (root != null
    
        Console.Write( root.data + " - > "); 
        root = root.next; 
    
    Console.Write("null"); 
  
// Function to generate the required 
// linked list and return its head 
static Node newList(Node root1, Node root2) 
    Node ptr1 = root1, ptr2 = root2; 
    Node root = null
  
    // While there are nodes left 
    while (ptr1 != null
    
  
        // Maximum node at current position 
        int currMax = ((ptr1.data < ptr2.data) 
                        ? ptr2.data 
                        : ptr1.data); 
  
        // If current node is the first node 
        // of the newly linked list being 
        // generated then assign it to the root 
        if (root == null
        
            Node temp = new Node(); 
            temp.data = currMax; 
            temp.next = null
            root = temp; 
        
  
        // Else insert the newly 
        // created node in the end 
        else
        
            root = insert(root, currMax); 
        
  
        // Get to the next nodes 
        ptr1 = ptr1.next; 
        ptr2 = ptr2.next; 
    
  
    // Return the head of the 
    // generated linked list 
    return root; 
  
// Driver code 
public static void Main(String []args) 
    Node root1 = null, root2 = null, root = null
  
    // First linked list 
    root1 = insert(root1, 5); 
    root1 = insert(root1, 2); 
    root1 = insert(root1, 3); 
    root1 = insert(root1, 8); 
  
    // Second linked list 
    root2 = insert(root2, 1); 
    root2 = insert(root2, 7); 
    root2 = insert(root2, 4); 
    root2 = insert(root2, 5); 
  
    // Generate the new linked list 
    // and get its head 
    root = newList(root1, root2); 
  
    // Display the nodes of the generated list 
    display(root); 
  
  
/* This code contributed by PrinciRaj1992 */

chevron_right


Output:

5 -> 7 -> 4 -> 8 -> NULL


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 : andrew1234, princiraj1992



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.