Given a singly 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++ 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;
} // Function 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;
} |
// 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;
} // Function 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 |
# Python3 program to prsecond linked list # according to data in the first linked list # Linked List Node class new_Node:
# Constructor to initialize the node object
def __init__( self , data):
self .data = data
self . next = None
''' Function to insert a node at the beginning ''' def push(head_ref, new_data):
new_node = new_Node(new_data)
new_node. next = head_ref
head_ref = new_node
return head_ref
# Function to print second list according # to the positions referred by the 1st list def printSecondList(l1,l2):
temp = l1
temp1 = l2
# While first linked list is not None.
while (temp ! = None ):
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 + = 1
# Print node at position in second list
# pointed by current element of first list
print (temp1.data,end = " " )
# Increment first linked list
temp = temp. next
# Set temp1 to the start of the
# second linked list
temp1 = l2
# Driver Code l1 = None
l2 = None
# 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 shubhamsingh10 |
// 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;
} // Function 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 |
<script> // JavaScript program to print second linked list // according to data in the first linked list class Node { constructor()
{
this .data=0;
this .next= null ;
}
} /* Function to insert a node at the beginning */ function push(head_ref, new_data)
{ let new_node = new Node();
new_node.data = new_data;
new_node.next = (head_ref);
(head_ref) = new_node;
return head_ref;
} // Function to print the second list according // to the positions referred by the 1st list function printSecondList(l1,l2)
{ let temp = l1;
let temp1 = l2;
// While first linked list is not null.
while (temp != null )
{
let 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
document.write( temp1.data + " " );
// Increment first linked list
temp = temp.next;
// Set temp1 to the start of the
// second linked list
temp1 = l2;
}
} // Driver Code let 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 avanitrachhadiya2155 </script> |
Output
5 8
Complexity Analysis:
-
Time Complexity: O(n^2)
- As we are using nested loops and traversing the items of the second list for every element in the first list.
-
Auxiliary Space: O(1)
- As constant extra space is used.
Another approach:
As we know that the data in the first list is sorted we can make use of this fact to traverse the second list.
- Make two pointers to head of both the lists
- Set a counter to 1
- Keep incrementing the counter and moving forward in the second list till the counter’s value is less to the data at current pointer in first list
- Print the data of second list pointer and increment the pointer to first list
- Repeat steps 3-4 until the pointer to 1st list is not NULL.
implementation:
// 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;
} // Function to print the second list according // to the positions referred by the 1st list void printSecondList(Node* l1, Node* l2)
{ struct Node* temp1 = l1;
struct Node* temp2 = l2;
int counter = 1;
// While first linked list is not null.
while (temp1 != NULL) {
// while the counter is less than the data at temp1
while (counter < temp1->data) {
// Keep incrementing second list
temp2 = temp2->next;
counter++;
}
// Print the node at position in second list
// pointed by current element of first list
cout << temp2->data << " " ;
// Increment first linked list
temp1 = temp1->next;
}
} // 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;
} // This code is contributed by Abhijeet Kumar(abhijeet19403) |
// 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;
}
// Function to print the second list according
// to the positions referred by the 1st list
static void printSecondList(Node l1, Node l2)
{
Node temp1 = l1;
Node temp2 = l2;
int counter = 1 ;
// While first linked list is not null.
while (temp1 != null ) {
// while the counter is less than the data at
// temp1
while (counter < temp1.data) {
// Keep incrementing second list
temp2 = temp2.next;
counter++;
}
// Print the node at position in second list
// pointed by current element of first list
System.out.print(temp2.data + " " );
// Increment first linked list
temp1 = temp1.next;
}
}
// 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 Abhijeet Kumar(abhijeet19403) |
# Python3 program to prsecond linked list # according to data in the first linked list # Linked List Node class new_Node:
# Constructor to initialize the node object
def __init__( self , data):
self .data = data
self . next = None
''' Function to insert a node at the beginning ''' def push(head_ref, new_data):
new_node = new_Node(new_data)
new_node. next = head_ref
head_ref = new_node
return head_ref
# Function to print second list according # to the positions referred by the 1st list def printSecondList(l1, l2):
temp1 = l1
temp2 = l2
counter = 1
# While first linked list is not None.
while (temp1 ! = None ):
# while the counter is less than the data at temp1
while (counter < temp1.data):
# Keep incrementing second list
temp2 = temp2. next
counter + = 1
# Print node at position in second list
# pointed by current element of first list
print (temp2.data, end = " " )
# Increment first linked list
temp1 = temp1. next
# Driver Code l1 = None
l2 = None
# 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 Abhijeet Kumar(abhijeet19403) |
// 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;
}
// Function to print the second list according
// to the positions referred by the 1st list
static void printSecondList(Node l1, Node l2)
{
Node temp1 = l1;
Node temp2 = l2;
int counter = 1;
// While first linked list is not null.
while (temp1 != null ) {
// while the counter is less than the data at
// temp1
while (counter < temp1.data) {
// Keep incrementing second list
temp2 = temp2.next;
counter++;
}
// Print the node at position in second list
// pointed by current element of first list
Console.Write(temp2.data + " " );
// Increment first linked list
temp1 = temp1.next;
}
}
// 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 Abhijeet Kumar(abhijeet19403) |
<script> // JavaScript program to print second linked list // according to data in the first linked list class Node { constructor()
{
this .data=0;
this .next= null ;
}
} /* Function to insert a node at the beginning */ function push(head_ref, new_data)
{ let new_node = new Node();
new_node.data = new_data;
new_node.next = (head_ref);
(head_ref) = new_node;
return head_ref;
} // Function to print the second list according // to the positions referred by the 1st list function printSecondList(l1,l2)
{ let temp1 = l1;
let temp2 = l2;
let counter = 1;
// While first linked list is not null.
while (temp1 != null )
{
// while the counter is less than the data at temp1
while (counter < temp1.data)
{
// Keep incrementing second list
temp2 = temp2.next;
counter++;
}
// Print the node at position in second list
// pointed by current element of first list
document.write( temp2.data + " " );
// Increment first linked list
temp1 = temp1.next;
}
} // Driver Code let 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 Abhijeet Kumar(abhijeet19403) </script> |
Output
5 8
Complexity Analysis:
-
Time Complexity: O(n)
- Although we are using nested loops but total number of operations is limited to O(n) only.
-
Auxiliary Space: O(1)
- As constant extra space is used.
This approach was contributed by Abhijeet Kumar.