7-16 两个有序链表序列的交集(20 分)

来源:互联网 发布:oracle数据库出现问题 编辑:程序博客网 时间:2024/04/30 01:59

7-16 两个有序链表序列的交集(20 分)

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

输入格式:

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

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 2 5 -12 4 5 8 10 -1

输出样例:

2 5这个用数组模拟过不了code: 
#include <stdio.h>#include <string.h>#include <stdlib.h>//一个开始用数组最后一个点总是过不了,就老实写链表了struct Node{int Data;struct Node* Next;};//链表结构体typedef struct Node* List;//创建一个链表List Creat(){List head = (List)malloc(sizeof(struct Node)),q;head->Next = NULL;q = head;//创建头结点的链表 int x;while(~scanf("%d",&x)&&x!=-1){List p = (List)malloc(sizeof(struct Node));p->Data = x;p->Next = NULL;//赋值操作 q->Next = p;//前一个的下一个为新创建的结点 q = p;//尾指针指向最后一个 } return head;} //求交集List Merge(List a,List b){a = a->Next;b = b->Next;//分别指向第一个有效结点//创建交集链表的表头List head = (List)malloc(sizeof(struct Node));head->Next = NULL;List q = head; while(a&&b){if(a==NULL||a->Data > b->Data){b = b->Next;//如果a为空,或者a比b大,a不能移动了,b往后移找更大的 }else if(b==NULL||b->Data > a->Data){a = a->Next;//同理 }else{//相同创建新的交集链表 List p = (List)malloc(sizeof(struct Node));p->Data = b->Data;p->Next = NULL;q->Next = p;q = p;a = a->Next;b = b->Next;//同时移动到下一个 }}return head;}//打印链表 void printList(List a){a = a->Next;if(a==NULL){//为空输出NULL; printf("NULL\n");return;}int flag = 0;while(a!=NULL){if(!flag)printf("%d",a->Data);else printf(" %d",a->Data);flag = 1;a = a->Next;//移动下一个,老是忘。。。。 }puts("");return;} int main(){List a = Creat();List b = Creat();List c = Merge(a,b);printList(c);return 0;}


阅读全文
0 0
原创粉丝点击