# C Program To Merge A Linked List Into Another Linked List At Alternate Positions

• Last Updated : 31 Mar, 2022

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.

## C

 `// C program to merge a linked list into``// another at alternate positions``#include ``#include ` `// A nested 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)``{``    ``struct` `Node* new_node =``           ``(``struct` `Node*) ``malloc``(``sizeof``(``struct` `Node));``    ``new_node->data  = new_data;``    ``new_node->next = (*head_ref);``    ``(*head_ref)  = new_node;``}` `/* Utility function to print a``   ``singly linked list */``void` `printList(``struct` `Node *head)``{``    ``struct` `Node *temp = head;``    ``while` `(temp != NULL)``    ``{``        ``printf``(``"%d "``, temp->data);``        ``temp = temp->next;``    ``}``    ``printf``(``""``);``}` `// 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.``void` `merge(``struct` `Node *p, ``struct` `Node **q)``{``     ``struct` `Node *p_curr = p,``                 ``*q_curr = *q;``     ``struct` `Node *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;``}` `// Driver code``int` `main()``{``     ``struct` `Node *p = NULL, *q = NULL;``     ``push(&p, 3);``     ``push(&p, 2);``     ``push(&p, 1);``     ``printf``(``     ``"First Linked List:"``);``     ``printList(p);` `     ``push(&q, 8);``     ``push(&q, 7);``     ``push(&q, 6);``     ``push(&q, 5);``     ``push(&q, 4);``     ``printf``(``     ``"Second Linked List:"``);``     ``printList(q);` `     ``merge(p, &q);` `     ``printf``(``     ``"Modified First Linked List:"``);``     ``printList(p);` `     ``printf``(``     ``"Modified Second Linked List:"``);``     ``printList(q);` `     ``getchar``();``     ``return` `0;``}`

Output:

```First Linked List:
1 2 3
4 5 6 7 8
1 4 2 5 3 6