Open In App

Javascript Program To Merge A Linked List Into Another Linked List At Alternate Positions

Last Updated : 03 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Given two linked lists, insert nodes of the second list into the first list at alternate positions of the first list. 

For example, if first list is 5->7->17->13->11 and second is 12->10->2->4->6, the first list should become 5->12->7->10->17->2->13->4->11->6 and second list should become empty. The nodes of the second list should only be inserted when there are positions available. For example, if the first list is 1->2->3 and the second list is 4->5->6->7->8, then the first list should become 1->4->2->5->3->6 and the second list to 7->8.

Use of extra space is not allowed (Not allowed to create additional nodes), i.e., insertion must be done in-place. The expected time complexity is O(n) where n is a number of nodes in the first list. 

The idea is to run a loop while there are available positions in first loop and insert nodes of second list by changing pointers. Following are implementations of this approach. 

JavaScript
// Javascript program to merge a linked list 
// into another at alternate positions 

// A nexted list node 
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;

}

/* Utility function to print a 
   singly linked list */
function printList(head) {
    let temp = head;
    while (temp != null) {
        console.log(temp.data + " ");
        temp = temp.next;
    }
}

// Main function that inserts nodes of 
// linked list q into p at alternate 
// positions. Since head of first list 
// never changes and head of second list 
// may change, we need single pointer for 
// first list and double pointer for second 
// list. 
function merge(p, q) {
    let p_curr = p, q_curr = q;
    let p_next, q_next;

    // While there are available positions 
    // in p 
    while (p_curr != null &&
        q_curr != null) {
        // Save next pointers 
        p_next = p_curr.next;
        q_next = q_curr.next;

        // Make q_curr as next of p_curr 
        // Change next pointer of q_curr 
        q_curr.next = p_next;

        // Change next pointer of p_curr 
        p_curr.next = q_curr;

        // Update current pointers for next 
        // iteration 
        p_curr = p_next;
        q_curr = q_next;
    }

    // Update head pointer of second list
    q = q_curr;
    return q;
}

// Driver code 
let p = null, q = null;
p = push(p, 3);
p = push(p, 2);
p = push(p, 1);
console.log(
    "First Linked List:");
printList(p);
q = push(q, 8);
q = push(q, 7);
q = push(q, 6);
q = push(q, 5);
q = push(q, 4);
console.log(
    "Second Linked List:");
printList(q);
q = merge(p, q);
console.log(
    "Modified First Linked List:");
printList(p);
console.log(
    "Modified Second Linked List:");
printList(q);
// This code is contributed by rrrtnx.

Output
First Linked List:
1 
2 
3 
Second Linked List:
4 
5 
6 
7 
8 
Modified First Linked List:
1 
4 
2 
5 
3 
6 
Modified Second Linked List:
7 
8 

Complexity Analysis:

  • Time Complexity: O(N)
  • Auxiliary Space: O(1)

Please refer complete article on Merge a linked list into another linked list at alternate positions for more details!



Next Article
Practice Tags :

Similar Reads