PTA 两个有序链表序列的交集 (实验)
已知两个非降序链表序列 S1 与 S2,设计函数构造出 S1 与 S2 的交集新链表 S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1 表示序列的结尾(−1 不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出 NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
解题
#include<stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType data;
PtrToNode next;
};
PtrToNode insertNodeTail(PtrToNode head);
void PrintList(PtrToNode pNode);
typedef PtrToNode List;
/**
* 初始化单链表
* @return
*/
List InitList() {
List L;
L = (List) malloc(sizeof(struct Node));
L->next = NULL;
return L;
};
/**
* 打印链表
* @param pNode 链表头结点
*/
void PrintList(List pNode) {
if (pNode == NULL) {
printf("NULL");
return;
}
List p = pNode;
while (p->next != NULL) {
printf("%d ", p->data);
p = p->next;
}
//结尾不留空格
printf("%d", p->data);
}
/**
* 尾插法
* @param head 链表头结点
* @return 尾插法链表
*/
PtrToNode insertNodeTail(List head) {
List newHead = InitList();
//虚拟头结点解决head的插入
newHead->next = head;
List p = newHead;
//循环条件
int flag = 1;
int sData;
while (flag) {
scanf("%d", &sData);
if (sData != -1) {
List node = InitList();
node->data = sData;
p->next = node;
p = node;
} else {
flag = 0;
p->next = NULL;
}
}
return newHead->next;
}
int main() {
List linkList1 = InitList();
linkList1 = insertNodeTail(linkList1);
List linkList2 = InitList();
linkList2 = insertNodeTail(linkList2);
List p1 = linkList1;
List p2 = linkList2;
List newLinkList = InitList();
List tail = newLinkList;
while (p1 != NULL && p2 != NULL) {
//利用非降序列表的特性
//如果哪个指针比较小,则往后进位
if (p1->data < p2->data) {
p1 = p1->next;
} else if (p1->data > p2->data) {
p2 = p2->next;
} else {
List node = InitList();
node->data = p1->data;
//将相等的值链到新链表里
tail->next = node;
tail = node;
p1 = p1->next;
}
}
PrintList(newLinkList->next);
return 0;
}