C++ Program For In-Place Merge Two Linked Lists Without Changing Links Of First List
Last Updated :
31 Mar, 2022
Given two sorted singly linked lists having n and m elements each, merge them using constant space. First, n smallest elements in both the lists should become part of the first list and the rest elements should be part of the second list. Sorted order should be maintained. We are not allowed to change pointers of the first linked list.
Example:
Input:
First List: 2->4->7->8->10
Second List: 1->3->12
Output:
First List: 1->2->3->4->7
Second List: 8->10->12
We strongly recommend you to minimize your browser and try this yourself first.
The problem becomes very simple if we’re allowed to change pointers of the first linked list. If we are allowed to change links, we can simply do something like a merge of the merge-sort algorithm. We assign the first n smallest elements to the first linked list where n is the number of elements in the first linked list and the rest to the second linked list. We can achieve this in O(m + n) time and O(1) space, but this solution violates the requirement that we can't change links of the first list.
The problem becomes a little tricky as we're not allowed to change pointers in the first linked list. The idea is something similar to this post but as we are given a singly linked list, we can't proceed backward with the last element of LL2.
The idea is for each element of LL1, we compare it with the first element of LL2. If LL1 has a greater element than the first element of LL2, then we swap the two elements involved. To keep LL2 sorted, we need to place the first element of LL2 at its correct position. We can find a mismatch by traversing LL2 once and correcting the pointers.
Below is the implementation of this idea.
C++
// C++ Program to merge two sorted linked lists
// without using any extra space and without
// changing links of first list
#include <bits/stdc++.h>
using namespace std;
// Structure for a linked list node
struct Node
{
int data;
struct Node *next;
};
/* Given a reference (pointer to pointer)
to the head of a list and an int, push
a new node on the front of the list. */
void push(struct Node** head_ref,
int new_data)
{
// Allocate node
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));
// Put in the data
new_node->data = new_data;
/* Link the old list off the
new node */
new_node->next = (*head_ref);
/* Move the head to point to
the new node */
(*head_ref) = new_node;
}
// Function to merge two sorted
// linked lists LL1 and LL2 without
// using any extra space.
void mergeLists(struct Node *a,
struct Node * &b)
{
// Run till either one of a or b
// runs out
while (a && b)
{
// For each element of LL1,
// compare it with first element
// of LL2.
if (a->data > b->data)
{
// Swap the two elements involved
// if LL1 has a greater element
swap(a->data, b->data);
struct Node *temp = b;
// To keep LL2 sorted, place
// first element of LL2 at its
// correct place
if (b->next && b->data >
b->next->data)
{
b = b->next;
struct Node *ptr= b,
*prev = NULL;
// Find mismatch by traversing
// the second linked list once
while (ptr && ptr->data <
temp->data)
{
prev = ptr;
ptr = ptr -> next;
}
// correct the pointers
prev->next = temp;
temp->next = ptr;
}
}
// Move LL1 pointer to next element
a = a->next;
}
}
// Code to print the linked link
void printList(struct Node *head)
{
while (head)
{
cout << head->data << "->" ;
head = head->next;
}
cout << "NULL" << endl;
}
// Driver code
int main()
{
struct Node *a = NULL;
push(&a, 10);
push(&a, 8);
push(&a, 7);
push(&a, 4);
push(&a, 2);
struct Node *b = NULL;
push(&b, 12);
push(&b, 3);
push(&b, 1);
mergeLists(a, b);
cout << "First List: ";
printList(a);
cout << "Second List: ";
printList(b);
return 0;
}
Output :
First List: 1->2->3->4->7->NULL
Second List: 8->10->12->NULL
Time Complexity : O(mn)
Auxiliary Space: O(1)
Please refer complete article on In-place Merge two linked lists without changing links of first list for more details!
Similar Reads
C++ Program For Pairwise Swapping Elements Of A Given Linked List By Changing Links Given a singly linked list, write a function to swap elements pairwise. For example, if the linked list is 1->2->3->4->5->6->7 then the function should change it to 2->1->4->3->6->5->7, and if the linked list is 1->2->3->4->5->6 then the function sh
5 min read
C++ Program To Merge A Linked List Into Another Linked List At Alternate Positions Given two linked lists, insert nodes of second list into first list at alternate positions of 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 an
3 min read
C++ Program For Finding Intersection Point Of Two Linked Lists There are two singly linked lists in a system. By some programming error, the end node of one of the linked lists got linked to the second list, forming an inverted Y-shaped list. Write a program to get the point where two linked lists merge. Above diagram shows an example with two linked lists hav
9 min read
C++ Program For Finding Intersection Of Two Sorted Linked Lists Given two lists sorted in increasing order, create and return a new list representing the intersection of the two lists. The new list should be made with its own memory â the original lists should not be changed. Example: Input: First linked list: 1->2->3->4->6 Second linked list be 2-
6 min read
C++ Program For Merge Sort For Doubly Linked List Given a doubly linked list, write a function to sort the doubly linked list in increasing order using merge sort.For example, the following doubly linked list should be changed to 24810 Recommended: Please solve it on "PRACTICE" first, before moving on to the solution. Merge sort for singly linked l
3 min read