描述
给定两个递增的整数序列A和B,利用链表表示序列A和B,将A和B合并为一个递增的有序序列C,序列C不允许有重复的数据。要求空间复杂度为O(1)。
输入
多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。
输出
对于每组数据输出一行,为合并后的序列,每个数据之间用空格分隔。
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L) //初始化
{
L = new LNode;
L->next = NULL;
}
void CreatList(LinkList &L,int n) //尾插法建表
{
LinkList rear = L;
for(int i=0;i<n;i++)
{
int temp;
cin>>temp;
LinkList h = new LNode;
h->data = temp;
rear->next = h;
rear = h;
}
rear->next = NULL;
}
void print_list(LinkList &L) //遍历输出表中元素
{
LinkList p = L->next;
while(p!=NULL)
{
cout<<p->data;
if(p->next!=NULL)
{
cout<<' ';
}
p = p->next;
}
cout<<endl;
}
void Merge_list(LinkList &A,LinkList &B) //合并两个表并输出
{
LinkList C = new LNode;
C->next = NULL;
LinkList pa = A->next;
LinkList pb = B->next;
LinkList pc = C;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data>pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
else if(pa->data<pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pa;
pc = pa;
pa = pa->next;
pb = pb->next;
}
}
if(pa!=NULL&&pb==NULL)
{
pc->next = pa;
}
if(pb!=NULL&&pa==NULL)
{
pc->next = pb;
}
print_list(C);
}
int main()
{
while(true)
{
int n,m;
cin>>n>>m;
if(n==0&&m==0)
{
break;
}
LinkList A,B;
InitList(A);
InitList(B);
CreatList(A,n);
CreatList(B,m);
Merge_list(A,B);
}
}