每日一题Day23

基于链表的两个递增有序序列的合并

描述

给定两个递增的整数序列A和B,利用链表表示序列A和B,将A和B合并为一个递增的有序序列C,序列C不允许有重复的数据。要求空间复杂度为O(1)。

输入

多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。

输出

对于每组数据输出一行,为合并后的序列,每个数据之间用空格分隔。

样例输入1 

5 5
1 3 5 7 9 
2 4 6 8 10 
3 4
1 5 9
1 2 5 9
0 0

样例输出1

1 2 3 4 5 6 7 8 9 10
1 2 5 9

解答:尾插法分别建立两个递增有序序列的链表。顺序遍历两个链表进行合并。

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
} Node,*List;

void Merge(List &La,List &Lb)
{
	Node *p1,*p2,*p3,*q;
	p1=La->next;
	p2=Lb->next;
	p3=La;
	while(p1&&p2)
	{
		if(p1->data < p2->data)
		{
			p3->next=p1;
			p3=p3->next;
			p1=p1->next;
		}
		else if(p2->data < p1->data)
		{
			p3->next=p2;
			p3=p3->next;
			p2=p2->next;
		}
		else
		{
			p3->next=p1;
			p3=p3->next;
			p1=p1->next;
			q=p2;
			p2=p2->next;
			free(q);
		}
	}
	p3->next=p1?p1:p2;
	free(Lb);
}

int main()
{
	int n,m;
	List La,Lb;
	Node *p,*q,*rear;
	while(1)
	{
		scanf("%d %d",&n,&m);
		if(n==0&&m==0)
			break;
		La = (Node *)malloc(sizeof(Node));
		La->next=NULL;
		rear=La;
		while(n--)
		{
			p=(Node *)malloc(sizeof(Node));
			scanf("%d",&p->data);
			p->next=rear->next;
			rear->next=p;
			rear=p;
		}
		Lb = (Node *)malloc(sizeof(Node));
		Lb->next=NULL;
		rear=Lb;
		while(m--)
		{
			p=(Node *)malloc(sizeof(Node));
			scanf("%d",&p->data);
			p->next=rear->next;
			rear->next=p;
			rear=p;
		}
		Merge(La,Lb);
		p=La->next;
		int first=1;
		while(p)
		{
			if(first)
			{
				first=0;
				printf("%d",p->data);
			}
			else
			{
				printf(" %d",p->data);
			}
			p=p->next;
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81585718