82 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// Let X = (x1, x2….xn) and Y = (y1, y2….yn) be 2 linked lists. Assume that, in each list,
 | 
						|
// the nodes are in non-decreasing order of the data field values. Write an algorithm to
 | 
						|
// merge two lists to obtain a new linked list Z in which the nodes are also in the non-
 | 
						|
// decreasing order. Following the merge, X and Y do not exist as individual lists. Each
 | 
						|
// node initially in X or Y is now in Z. Do not use additional nodes.
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
typedef struct node *nodePtr;
 | 
						|
struct node {
 | 
						|
    int data;
 | 
						|
    nodePtr link;
 | 
						|
};
 | 
						|
 | 
						|
nodePtr merge(nodePtr x, nodePtr y)
 | 
						|
{
 | 
						|
    nodePtr z, temp;
 | 
						|
    if (!x) return y;
 | 
						|
    if (!y) return x;
 | 
						|
    if (x->data <= y->data) {
 | 
						|
        z = x;
 | 
						|
        x = x->link;
 | 
						|
    } else {
 | 
						|
        z = y;
 | 
						|
        y = y->link;
 | 
						|
    }
 | 
						|
    temp = z;
 | 
						|
    while (x && y) {
 | 
						|
        if (x->data <= y->data) {
 | 
						|
            temp->link = x;
 | 
						|
            x = x->link;
 | 
						|
        } else {
 | 
						|
            temp->link = y;
 | 
						|
            y = y->link;
 | 
						|
        }
 | 
						|
        temp = temp->link;
 | 
						|
    }
 | 
						|
    if (x) temp->link = x;
 | 
						|
    if (y) temp->link = y;
 | 
						|
    return z;
 | 
						|
}
 | 
						|
 | 
						|
void printList(nodePtr head)
 | 
						|
{
 | 
						|
    while (head) {
 | 
						|
        printf("%d ", head->data);
 | 
						|
        head = head->link;
 | 
						|
    }
 | 
						|
    printf("\n");
 | 
						|
}
 | 
						|
 | 
						|
nodePtr createNode(int data)
 | 
						|
{
 | 
						|
    nodePtr newNode = (nodePtr)malloc(sizeof(struct node));
 | 
						|
    newNode->data = data;
 | 
						|
    newNode->link = NULL;
 | 
						|
    return newNode;
 | 
						|
}
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
    nodePtr x = createNode(1);
 | 
						|
    x->link = createNode(3);
 | 
						|
    x->link->link = createNode(5);
 | 
						|
 | 
						|
    nodePtr y = createNode(2);
 | 
						|
    y->link = createNode(4);
 | 
						|
    y->link->link = createNode(6);
 | 
						|
 | 
						|
    printf("List X: ");
 | 
						|
    printList(x);
 | 
						|
    printf("List Y: ");
 | 
						|
    printList(y);
 | 
						|
 | 
						|
    nodePtr z = merge(x, y);
 | 
						|
 | 
						|
    printf("Merged list Z: ");
 | 
						|
    printList(z);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |