已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
**输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
#include <iostream>
#include <cstdlib>
#include <new>
using namespace std;
struct Node
{
int number;
Node *next;
};
typedef Node* ListNode;
Node* CreatList(); //创建带空头结点的链表
Node* intersection(ListNode &a, ListNode &b); //取出两个链表数据中的交集
void PrintLsit(Node *p); //打印链表
int main()
{
Node *head1, *head2, *head;
head1 = CreatList();
head2 = CreatList();
head = intersection(head1, head2);
PrintLsit(head);
return 0;
}
Node* CreatList()
{
int temp;
Node *head, *p, *tail;
head = new(Node);
head->next = NULL;
tail = head;
while (1)
{
cin >> temp;
if (temp == -1)
break;
p = new(Node);
p->next = NULL;
p->number = temp;
tail->next = p;
tail = p;
}
return head;
}
Node* intersection(ListNode &a, ListNode &b)
{
Node *head, *p, *tail;
head = new(Node);
head->next = NULL;
tail = head;
a = a->next; b = b->next;
while (a != NULL && b != NULL)
{
if (a->number > b->number)
b = b->next;
else if (a->number < b->number)
a = a->next;
else
{
p = new(Node);
p->next = NULL;
p->number = a->number;
a = a->next;
b = b->next;
tail->next = p;
tail = p;
}
}
return head;
}
void PrintLsit(Node *p)
{
p = p->next;
if (p == NULL)
cout << "NULL" << endl;
if (p != NULL)
{
cout << p->number;
p = p->next;
}
while (p != NULL)
{
cout << " " << p->number;
p = p->next;
}
}