Print nodes of linked list at given indexes

Given a singly linked list l1 which is sorted in ascending order and another singly linked list l2 which is unsorted. The task is to print the elements of the second linked list according to the position pointed out by the data in the nodes of the first linked list. For example, if the first linked list is 1->2->5 then you have to print the 1st, 2nd and 5th elements of the second linked list.

Examples:

Input: l1 = 1->2->5
       l2 = 1->8->7->6->2->9->10
Output : 1->8->2
Elements in l1 are 1, 2 and 5. 
Therefore, print 1st, 2nd and 5th elements of l2,
Which are 1, 8 and 2.

Input: l1 = 2->5 
       l2 = 7->5->3->2->8
Output: 5->8 


Take two pointers to traverse the two linked lists using two nested loops. The outer loop points to the elements of the first list and the inner loop point to the elements of the second list respectively. In the first iteration of outer loop, the pointer to the head of the first linked list points to its root node. We traverse the second linked list until we reach the position pointed out by the node’s data in the first linked list. Once the required position is reached, print the data of the second list and repeat this process again until we reach the end of the first linked list.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to print second linked list
// according to data in the first linked list
#include <iostream>
using namespace std;
  
// Linked List Node
struct Node {
    int data;
    struct Node* next;
};
  
/* Function to insert a node at the beginning */
void push(struct Node** head_ref, int new_data)
{
    Node* new_node = new Node;
  
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
  
// Fucntion to print the second list according
// to the positions referred by the 1st list
void printSecondList(Node* l1, Node* l2)
{
    struct Node* temp = l1;
    struct Node* temp1 = l2;
  
    // While first linked list is not null.
    while (temp != NULL) {
        int i = 1;
  
        // While second linked list is not equal
        // to the data in the node of the
        // first linked list.
        while (i < temp->data) {
            // Keep incrementing second list
            temp1 = temp1->next;
            i++;
        }
  
        // Print the node at position in second list
        // pointed by current element of first list
        cout << temp1->data << " ";
  
        // Increment first linked list
        temp = temp->next;
  
        // Set temp1 to the start of the
        // second linked list
        temp1 = l2;
    }
}
  
// Driver Code
int main()
{
    struct Node *l1 = NULL, *l2 = NULL;
  
    // Creating 1st list
    // 2 -> 5
    push(&l1, 5);
    push(&l1, 2);
  
    // Creating 2nd list
    // 4 -> 5 -> 6 -> 7 -> 8
    push(&l2, 8);
    push(&l2, 7);
    push(&l2, 6);
    push(&l2, 5);
    push(&l2, 4);
  
    printSecondList(l1, l2);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to print second linked list 
// according to data in the first linked list 
class GFG
{
      
// Linked List Node 
static class Node
    int data; 
    Node next; 
}; 
  
/* Function to insert a node at the beginning */
static Node push( Node head_ref, int new_data) 
    Node new_node = new Node(); 
  
    new_node.data = new_data; 
    new_node.next = (head_ref); 
    (head_ref) = new_node;
    return head_ref; 
  
// Fucntion to print the second list according 
// to the positions referred by the 1st list 
static void printSecondList(Node l1, Node l2) 
    Node temp = l1; 
    Node temp1 = l2; 
  
    // While first linked list is not null. 
    while (temp != null)
    
        int i = 1
  
        // While second linked list is not equal 
        // to the data in the node of the 
        // first linked list. 
        while (i < temp.data) 
        
            // Keep incrementing second list 
            temp1 = temp1.next; 
            i++; 
        
  
        // Print the node at position in second list 
        // pointed by current element of first list 
        System.out.print( temp1.data + " "); 
  
        // Increment first linked list 
        temp = temp.next; 
  
        // Set temp1 to the start of the 
        // second linked list 
        temp1 = l2; 
    
  
// Driver Code 
public static void main(String args[]) 
    Node l1 = null, l2 = null
  
    // Creating 1st list 
    // 2 . 5 
    l1 = push(l1, 5); 
    l1 = push(l1, 2); 
  
    // Creating 2nd list 
    // 4 . 5 . 6 . 7 . 8 
    l2 = push(l2, 8); 
    l2 = push(l2, 7); 
    l2 = push(l2, 6); 
    l2 = push(l2, 5); 
    l2 = push(l2, 4); 
  
    printSecondList(l1, l2); 
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to print second linked list 
// according to data in the first linked list 
using System;
  
class GFG 
      
// Linked List Node 
public class Node 
    public int data; 
    public Node next; 
}; 
  
/* Function to insert a node at the beginning */
static Node push( Node head_ref, int new_data) 
    Node new_node = new Node(); 
  
    new_node.data = new_data; 
    new_node.next = (head_ref); 
    (head_ref) = new_node; 
    return head_ref; 
  
// Fucntion to print the second list according 
// to the positions referred by the 1st list 
static void printSecondList(Node l1, Node l2) 
    Node temp = l1; 
    Node temp1 = l2; 
  
    // While first linked list is not null. 
    while (temp != null
    
        int i = 1; 
  
        // While second linked list is not equal 
        // to the data in the node of the 
        // first linked list. 
        while (i < temp.data) 
        
            // Keep incrementing second list 
            temp1 = temp1.next; 
            i++; 
        
  
        // Print the node at position in second list 
        // pointed by current element of first list 
        Console.Write( temp1.data + " "); 
  
        // Increment first linked list 
        temp = temp.next; 
  
        // Set temp1 to the start of the 
        // second linked list 
        temp1 = l2; 
    
  
// Driver Code 
public static void Main() 
    Node l1 = null, l2 = null
  
    // Creating 1st list 
    // 2 . 5 
    l1 = push(l1, 5); 
    l1 = push(l1, 2); 
  
    // Creating 2nd list 
    // 4 . 5 . 6 . 7 . 8 
    l2 = push(l2, 8); 
    l2 = push(l2, 7); 
    l2 = push(l2, 6); 
    l2 = push(l2, 5); 
    l2 = push(l2, 4); 
  
    printSecondList(l1, l2); 
  
// This code has been contributed by 29AjayKumar

chevron_right


Output:

5 8


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, 29AjayKumar



Article Tags :
Practice Tags :


1


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