7-51 两个有序链表序列的合并 (20 point(s))
已知两个非降序链表序列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 struct _list{
int data;
struct _list *next;
}List;
List * Create(void);
List * Combination(List *L1, List *L2);
void Print(List *L3);
int main() {
List *L1, *L2, *L3;
L1 = Create();
L2 = Create();
L3 = Combination(L1, L2);
Print(L3);
return 0;
}
List * Create(void) {
List *head, *tail;
head = (List *)malloc(sizeof(List));
head->next = NULL;
tail = head;
int num;
while (scanf("%d", &num) == 1 && num != -1) {
List *p = (List *)malloc(sizeof(List));
p->data = num;
tail->next = p;
tail = p;
}
tail->next = NULL;
return head;
}
List * Combination(List *L1, List *L2) {
List *head, *tail;
head = (List *)malloc(sizeof(List));
head->next = NULL;
tail = head;
while (L1->next && L2->next) {
if (L1->next->data >= L2->next->data) {
tail->next = L2->next;
L2->next = L2->next->next;
}
else {
tail->next = L1->next;
L1->next = L1->next->next;
}
tail = tail->next;
}
tail->next = L1->next ? L1->next : L2->next;
return head;
}
void Print(List *L3) {
if (L3->next) {
while (L3->next) {
printf("%d", L3->next->data);
if (L3->next->next) {
printf(" ");
}
else {
printf("\n");
}
L3 = L3->next;
}
}
else {
printf("NULL");
}
}