已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
#include<stdio.h>
#include <stdlib.h>
struct LNode {
int data;
struct LNode *next;
};
struct LNode*creatlist()
{
struct LNode *p,*t,*head;
int i;
head=(struct LNode *)malloc(sizeof(struct LNode));//给头节点分配空间
t=head;//用一个手抓住头节点
while(scanf("%d",&i)&&i>=0)//当输入并且输入不为—1时进入循环
{
p=(struct LNode*)malloc(sizeof(struct LNode));//为节点分配空间
p->data=i;//把输入的数放在新节点的数值部位
p->next =NULL;//初始化新节点的指针域
t->next=p;//在头结点后面安上新节点
t=p;//把手放在新节点上
}
return head;
}
struct LNode*ADDlist(struct LNode *L1,struct LNode *L2)
{
struct LNode *p1,*p2,*p3,*L3;//生成三个手
p1=L1->next;//抓住链表一的第一个节点
p2=L2->next ;//抓住链表二的第一个节点
L3=(struct LNode*)malloc(sizeof(struct LNode));//为链表三的头节点分配空间
L3->next =NULL;//初始化指针域
p3=L3;//抓住链表三的头节点
while(p1&&p2)//当手里都有东西的时候进入循环
{
if(p1->data>p2->data)//如果链表二的数据小
{
p3->next =p2;//拿着链表三的头节点直接怼在链表二上面
p2=p2->next ;//把抓着链表二的手往后挪一位
} else {//否则
p3->next =p1;//拿着链表三的头节点直接怼在链表一上面
p1=p1->next ;//把抓着链表一的手往后挪一位
}
p3=p3->next ;//把抓着链表三的手往后挪一位
}
if(p1)//跳出循环有两种可能的情况,如果链表一的元素没用完
{
p3->next =p1;//直接将链表三怼在链表一上面就行了
} else {//或者
p3->next =p2;//直接将链表三怼在链表二上面就行了
}
return L3;
}
void print(struct LNode *L3)
{
struct LNode *p;
p=(struct LNode *)malloc(sizeof(struct LNode));
p=L3->next;//用手抓住链表三的第一个节点
if(p==NULL)//如果手里没东西
{
printf("NULL");//接打印null
return;
}
while(p!=NULL)//如果手里有东西就进入循环
{
printf("%d",p->data);//就打印数据
p=p->next;//把手往后挪一位
if(p!=NULL)//如果在挪了一位之后手里拿着的还不是空的,说明后面还有元素,就打印个空格,最后一个元素后面不用打空格
printf(" ");
}
}
int main()
{
struct LNode *L1,*L2,*L3;//创建三个节点用于存放生成链表的头节点
L1=creatlist();//生成链表一放置第一列元素
L2=creatlist();//生成链表二放置第二列元素
L3=ADDlist(L1,L2);//合并链表一二并把结果放在链表三中
print(L3);//打印链表三
return 0;
}