Insert a whole linked list into other at k-th position

Given two linked list and a number k. Insert second linked list in to first at k-th position

Examples:

Input : a : 1->2->3->4->5->NULL
        b : 7->8->9->10->11->NULL
        k = 2
Output :1->2->7->8->9->10->11->3->4->5->NULL

Input : a: 10->15->20->NULL
        b: 11->17->16->18->NULL
        k = 3
Output : 10->15->20->11->17->16->18->NULL

A pictorial representation of the problem



1) Traverse the first linked list till k-th point
2) Join second linked list head node to k-th point of first linked list
3) Traverse the second linked list till end at
4) Add (k+1)th point of first linked list to the end of the second linked list

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// A C++ program to insert a linked list in
// to another linked list at position k
#include <bits/stdc++.h>
using namespace std;
  
/* Structure for a linked list node */
struct Node {
    int data;
    struct Node* next;
};
  
// Function to insert whole linked list in
// to another linked list at position k
void insert(struct Node* head1, struct Node* head2,
            int k)
{
    // traverse the first linked list until k-th
    // point is reached
    int count = 1;
    struct Node* curr = head1;
    while (count < k) {
        curr = curr->next;
        count++;
    }
  
    // backup next node of the k-th point
    struct Node* temp = curr->next;
  
    // join second linked list at the kth point
    curr->next = head2;
  
    // traverse the second linked list till end
    while (head2->next != NULL)
        head2 = head2->next;
  
    // join the second part of the linked list
    // to the end
    head2->next = temp;
}
  
// Function to print linked list recursively
void printList(Node* head)
{
    if (head == NULL)
        return;
  
    // If head is not NULL, print current node
    // and recur for remaining list
    cout << head->data << " ";
    printList(head->next);
}
  
/* Given a reference (pointer to pointer) to the head
  of a list and an int, insert a new node on the front
  of the list. */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = new Node;
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
  
/* Driven program to test above function */
int main()
{
    /* The constructed linked lists are :
     a: 1->2->3->4->5;
     b: 7->8->9->10->11 */
    struct Node* a = NULL;
    struct Node* b = NULL;
    int k = 2;
  
    // first linked list
    push(&a, 5);
    push(&a, 4);
    push(&a, 3);
    push(&a, 2);
    push(&a, 1);
  
    // second linked list
    push(&b, 11);
    push(&b, 10);
    push(&b, 9);
    push(&b, 8);
    push(&b, 7);
  
    printList(a);
    cout << "\n";
  
    printList(b);
  
    insert(a, b, k);
  
    cout << "\nResulting linked list\t";
    printList(a);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// A Java program to insert a linked list in
// to another linked list at position k
class GFG {
  
    // Structure for a linked list node /
    static class Node {
        int data;
        Node next;
    };
  
    // Function to insert whole linked list in
    // to another linked list at position k
    static Node insert(Node head1, Node head2,
                       int k)
    {
        // traverse the first linked list until k-th
        // point is reached
        int count = 1;
        Node curr = head1;
        while (count < k) {
            curr = curr.next;
            count++;
        }
  
        // backup next node of the k-th point
        Node temp = curr.next;
  
        // join second linked list at the kth point
        curr.next = head2;
  
        // traverse the second linked list till end
        while (head2.next != null)
            head2 = head2.next;
  
        // join the second part of the linked list
        // to the end
        head2.next = temp;
        return head1;
    }
  
    // Function to print linked list recursively
    static void printList(Node head)
    {
        if (head == null)
            return;
  
        // If head is not null, print current node
        // and recur for remaining list
        System.out.print(head.data + " ");
        printList(head.next);
    }
  
    // Given a reference (pointer to pointer) to the head
    // of a list and an int, insert a new node on the front
    // of the list.
    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;
    }
  
    // Driven code
    public static void main(String args[])
    {
        // The constructed linked lists are :
        // a: 1.2.3.4.5;
        // b: 7.8.9.10.11
        Node a = null;
        Node b = null;
        int k = 2;
  
        // first linked list
        a = push(a, 5);
        a = push(a, 4);
        a = push(a, 3);
        a = push(a, 2);
        a = push(a, 1);
  
        // second linked list
        b = push(b, 11);
        b = push(b, 10);
        b = push(b, 9);
        b = push(b, 8);
        b = push(b, 7);
  
        printList(a);
        System.out.println();
  
        printList(b);
  
        a = insert(a, b, k);
  
        System.out.print("\nResulting linked list\t");
        printList(a);
    }
}
  
// This code is contributed by Arnab Kundu

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# A Python3 program to insert a linked list in
# to another linked list at position k
  
# Node of the single linked list 
class Node: 
      
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# Function to insert whole linked list in
# to another linked list at position k
def insert(head1, head2, k):
  
    # traverse the first linked list until k-th
    # point is reached
    count = 1
    curr = head1
    while (count < k): 
        curr = curr.next
        count += 1
  
    # backup next node of the k-th point
    temp = curr.next
  
    # join second linked list at the kth point
    curr.next = head2
  
    # traverse the second linked list till end
    while (head2.next != None):
        head2 = head2.next
  
    # join the second part of the linked list
    # to the end
    head2.next = temp
    return head1
  
# Function to print linked list recursively
def printList(head):
  
    if (head == None):
        return
  
    # If head is not None, print current node
    # and recur for remaining list
    print( head.data, end = " ")
    printList(head.next)
  
""" Given a reference (pointer to pointer) to the head
of a list and an int, insert a new node on the front
of the list. """
def push(head_ref, new_data):
  
    new_node = Node(0)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
  
# Driver Code
if __name__ == "__main__"
  
    """ The constructed linked lists are :
    a: 1.2.3.4.5
    b: 7.8.9.10.11 """
    a = None
    b = None
    k = 2
  
    # first linked list
    a = push(a, 5)
    a = push(a, 4)
    a = push(a, 3)
    a = push(a, 2)
    a = push(a, 1)
  
    # second linked list
    b = push(b, 11)
    b = push(b, 10)
    b = push(b, 9)
    b = push(b, 8)
    b = push(b, 7)
  
    printList(a)
    print()
  
    printList(b)
  
    a = insert(a, b, k)
  
    print("\nResulting linked list\t", end = " ");
    printList(a)
  
# This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// A C# program to insert a linked list in
// to another linked list at position k
using System;
  
class GFG {
  
    // Structure for a linked list node /
    public class Node {
        public int data;
        public Node next;
    };
  
    // Function to insert whole linked list in
    // to another linked list at position k
    static Node insert(Node head1, Node head2,
                       int k)
    {
        // traverse the first linked list until k-th
        // point is reached
        int count = 1;
        Node curr = head1;
        while (count < k) {
            curr = curr.next;
            count++;
        }
  
        // backup next node of the k-th point
        Node temp = curr.next;
  
        // join second linked list at the kth point
        curr.next = head2;
  
        // traverse the second linked list till end
        while (head2.next != null)
            head2 = head2.next;
  
        // join the second part of the linked list
        // to the end
        head2.next = temp;
        return head1;
    }
  
    // Function to print linked list recursively
    static void printList(Node head)
    {
        if (head == null)
            return;
  
        // If head is not null, print current node
        // and recur for remaining list
        Console.Write(head.data + " ");
        printList(head.next);
    }
  
    // Given a reference (pointer to pointer) to the head
    // of a list and an int, insert a new node on the front
    // of the list.
    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;
    }
  
    // Driven code
    public static void Main(String[] args)
    {
        // The constructed linked lists are :
        // a: 1.2.3.4.5;
        // b: 7.8.9.10.11
        Node a = null;
        Node b = null;
        int k = 2;
  
        // first linked list
        a = push(a, 5);
        a = push(a, 4);
        a = push(a, 3);
        a = push(a, 2);
        a = push(a, 1);
  
        // second linked list
        b = push(b, 11);
        b = push(b, 10);
        b = push(b, 9);
        b = push(b, 8);
        b = push(b, 7);
  
        printList(a);
        Console.WriteLine();
  
        printList(b);
  
        a = insert(a, b, k);
  
        Console.Write("\nResulting linked list\t");
        printList(a);
    }
}
  
// This code contributed by Rajput-Ji

chevron_right



Output:

1 2 3 4 5 
7 8 9 10 11 
Resulting linked list    1 2 7 8 9 10 11 3 4 5 


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, Rajput-Ji



Article Tags :
Practice Tags :


2


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