已知两个非降序链表序列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> #include <string.h> typedef struct Node *Node; struct Node { int data; Node Next; }; Node CList() { int d; Node head = (Node)malloc(sizeof(struct Node)),q; head -> Next = NULL; q = head; while(~scanf("%d",&d)&&d!=-1) { Node p = (Node)malloc(sizeof(struct Node)); p -> data = d; p -> Next = NULL; q -> Next = p; q = p; } return head; } Node Merge(Node a,Node b) { a = a -> Next; b = b -> Next; Node head = (Node)malloc(sizeof(struct Node)); head -> Next = NULL; Node q = head; while(a || b) { Node p = (Node)malloc(sizeof(struct Node)); p -> Next = NULL; if(a == NULL || a -> data > b -> data) { p -> data = b -> data; b = b -> Next; q -> Next = p; q = p; } else { p -> data = a -> data; a = a -> Next; q -> Next = p; q = p; } } return head; } void printL(Node a) { a = a -> Next; if(a == NULL)printf("NULL"); int flag = 0; while(a) { if(flag)printf(" %d",a -> data); else printf("%d",a -> data); a = a -> Next; flag = 1; } } int main() { Node a = CList(); Node b = CList(); Node c = Merge(a,b); printL(c); }