目录
请编程实现有序链表合并。
函数接口定义:
LinkList Read( ); //按顺序依次读入元素,生成一个带头结点的单链表,表中元素值排列顺序与输入顺序一致,若输入-1,则创建链表结束(链表中不包含-1)。此处要求元素值按非递减顺序录入
LinkList Merge( LinkList L1, LinkList L2 );
//合并L1与L2。已知L1与L2中的元素非递减排列,要求合并后的单链表中元素也按值非递减排列。
参数 L1
和 L2
是两个有序链表(均按照非递减排列),均为带头结点的单链表。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
}LNode,*LinkList;
LinkList Read( );
LinkList Merge( LinkList L1, LinkList L2 );
int main()
{
LinkList L1, L2, L,p;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
if(!L)
{
printf("empty");
return 0;
}
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 3 5 8 -1
2 6 8 -1
输出样例:
1 2 3 5 6 8 8
答案:
LinkList Read()
{
LinkList head=(LinkList)malloc(sizeof(LNode));
head->data=-1;
head->next=NULL;
LinkList p=head;
ElemType n;
scanf("%d",&n);
while(n!=-1)
{
LinkList newnode=(LinkList)malloc(sizeof(LNode));
newnode->data=n;
newnode->next=NULL;
if(p->data!=-1)
{
if((p->data)<=(newnode->data))
{
p->next=newnode;
}
else
{
newnode->data=p->data;
p->data;
}
}
else
{
p->next=newnode;
}
p=p->next;
scanf("%d",&n);
}
return head;
}
LinkList Merge( LinkList L1, LinkList L2 )
{
if(!(L1->next)&&!(L2->next))
{
return NULL;
}
else
{
LinkList head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
head->data=0;
LinkList p;
L1=L1->next;
L2=L2->next;
p=head;
while(L1&&L2)
{
if((L1->data)>(L2->data))
{
p->next=L2;
p=p->next;
L2=L2->next;
}
else
{
p->next=L1;
p=p->next;
L1=L1->next;
}
}
if(L1!=NULL)
{
p->next=L1;
}
else
{
p->next=L2;
}
return head;
}
}