PAT 2-11 两个有序链表序列的合并(C语言实现)

来源:互联网 发布:中信银行客户端软件 编辑:程序博客网 时间:2024/05/14 07:05

题目描述:

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。

输入格式说明:

输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列)。数字用空格间隔。

输出格式说明:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出“NULL”。

样例输入与输出:

序号输入输出1
1 3 5 -12 4 6 8 10 -1
1 2 3 4 5 6 8 10
2
1 2 3 4 5 -11 2 3 4 5 -1
1 1 2 2 3 3 4 4 5 5
3
-1-1
NULL

解答说明:
依次扫描两个链表,将元素值较小的那个链表指针往后移,并将较小元素值放进第三个链表中。当其中一个链表扫描完时,将另一个非空链表剩余的值直接复制到新链表中。
源码:
#include<stdio.h>typedef struct node *ptrNode;typedef ptrNode LinkList;  //头结点typedef ptrNode Position;//中间节点typedef int ElementType;struct node{ElementType Element;Position next;};int IsEmpty(LinkList L){return L->next == NULL;}LinkList creatList(void)              {LinkList head,r,p;int x;head = (struct node*)malloc(sizeof(struct node));    //生成新结点r = head;scanf("%d",&x);while(x != -1){p = (struct node*)malloc(sizeof(struct node));p->Element = x;r->next = p;r = p;scanf("%d",&x);}r->next = NULL;return head;}LinkList mergeList(LinkList a, LinkList b){Position ha, hb,hc;LinkList c,r,p;ha = a->next;hb = b->next;c = (struct node*)malloc(sizeof(struct node));r = c;while((ha != NULL)&&(hb != NULL)){p = (struct node*)malloc(sizeof(struct node));if(ha->Element <= hb->Element){p->Element = ha->Element;ha = ha->next;}else{p->Element = hb->Element;hb = hb->next;}r->next = p;r = p;}if(ha == NULL){while(hb != NULL){p = (struct node*)malloc(sizeof(struct node));p->Element = hb->Element;hb = hb->next;r->next = p;    r = p;}}if(hb == NULL){while(ha != NULL){p = (struct node*)malloc(sizeof(struct node));p->Element = ha->Element;ha = ha->next;r->next = p;    r = p;}}r->next = NULL;return c;}void printList(LinkList L){LinkList hc;int flag = 0;hc = L->next;if(hc == NULL)printf("NULL");while(hc != NULL){if(flag)printf(" ");elseflag = 1;printf("%d",hc->Element);hc = hc->next;}}int main(void){LinkList L1,L2,L3;L1 = creatList();L2 = creatList();L3 = mergeList(L1,L2);printList(L3);return 0;}


0 0
原创粉丝点击