【问题描述】
两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。
【输入形式】
第一行首先是数据的个数,然后是第一个链表的各结点值,以空格分隔。
第二行首先也是数据的个数,然后是第二个链表的各结点值,以空格分隔。
【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。
【样例输入】
4 4 7 10 34
7 1 4 6 29 34 34 52
【样例输出】
1 4 6 7 10 29 34 52
【评分标准】
要使用链表实现,否则不能得分。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#include<string.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef Node* point;
Node* create(int x)
{
Node *L,*s;
int temp,i;
L=(Node*)malloc(sizeof(Node));
L->next=NULL;
for(i=1;i<=x;i++)
{ scanf("%d",&temp);
s=(Node*)malloc(sizeof(Node));
s->data=temp;
s->next=L->next;
L->next=s;
}
return L;
}
int s_et(point &head,int x)//找重复元素 c++可以用引用,相当方便
{
Node* p=head;
while(p!=NULL&&p->data!=x)
p=p->next;
if(p!=NULL)//有重复元素
return p->data;
return 0;//没有重复返回0
}
void Insert(Node* &head,int x)
{
if(head==NULL)//考虑第一个元素,没有头,要建头
{
head= (Node*)malloc(sizeof(struct Node));
head->next=NULL;
}
if(s_et(head,x)==0)// 没有重复的元素则插入
{ Node *s;
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->next=head->next;//头插法建新表
head->next=s;
}
}
Node* Merge(Node* p,Node* q)//两者比较
{ Node *L;
L=NULL;
p=p->next;
q=q->next;
while(p!=NULL&&q!=NULL)
{
if(p->data>q->data)//大的数存进去,头插法所以大的元素在后面
{Insert(L,p->data);
p=p->next;
}
else if(p->data<q->data)
{Insert(L,q->data);
q=q->next;
}
else{
Insert(L,p->data);//相等的话就直接存进任意一个进去
p=p->next;
q=q->next;
}
}
while(p!=NULL)//p有剩余,剩的都是小的,直接全部存进新链表
{
Insert(L, p->data);
p=p->next;
}
while(q!=NULL)
{
Insert(L, q->data);
q=q->next;
}
return L;
}
void show(Node* L)
{ Node *p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int a,b;
Node *L1,*L2,*L3;
scanf("%d",&a);
L1=create(a);
scanf("%d",&b);
L2=create(b);
L3=Merge(L1,L2);
show(L3);
}