已知两个非降序链表序列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>
typedef int ElementType;
typedef struct LNode* LinkList;
struct LNode{
ElementType Data;
LinkList Next;
};
LinkList ReadAttach(int temp, LinkList Rear){
LinkList p = (LinkList) malloc(sizeof(LinkList));
p->Next = NULL;
p->Data = temp;
//Rear指向新建结点
Rear->Next = p;
Rear = p;
return Rear;
}
LinkList Read(LinkList L){
// 构造空头节点
L = (LinkList) malloc(sizeof(LinkList));
L->Next = NULL;
L->Data = -1;
// Rear指向最后的节点
LinkList Rear = L;
ElementType temp;
//当输入数据不等于边界元素时执行
while(scanf("%d", &temp) && temp != -1) Rear = ReadAttach(temp, Rear);
return L;
}
void MergeAttach(LinkList* Rear, LinkList* temp){
// 指向指针的指针 最后节点连接新节点 并将最后节点指向新节点
(*Rear)->Next = (*temp);
(*Rear) = (*temp);
(*temp) = (*temp)->Next;
}
LinkList Merge(LinkList La, LinkList Lb){
// 构造空头节点
LinkList L = (LinkList) malloc(sizeof(LinkList));
L->Next = NULL;
L->Data = -1;
LinkList Rear = L;
// 跳过两个链表空头节点
La = La->Next;
Lb = Lb->Next;
// 当链表任一非空时执行循环
while(La && Lb){
if(La->Data <= Lb->Data) MergeAttach(&Rear, &La);
else MergeAttach(&Rear, &Lb);
}
// 连接剩余节点
while(La) MergeAttach(&Rear, &La);
while(Lb) MergeAttach(&Rear, &Lb);
return L;
}
void Print(LinkList L){
// omit NULL Node
L = L->Next;
int flag = 0;
while(L){
if(flag == 0){
printf("%d", L->Data);
flag = 1;
}
else{
printf(" %d", L->Data);
}
L = L->Next;
}
if(flag == 0) printf("NULL");
}
main(){
LinkList La, Lb, Lc;
La = Read(La);
Lb = Read(Lb);
Lc = Merge(La, Lb);
Print(Lc);
}