已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
解答:
S1和S2都是非降序序列,我们可以依次比较当前值。
1 : S1->val<S2->val
将S1指向下一位置
2 : S1->val<S2->val
将S2指向下一位置
3 : S1->val==S2->val
找到了两链表相同的值(即公共部分)将值连接在S3中并将S1与S2指向下一位置。
#include<iostream>
using namespace std;
struct Node {
int val;
struct Node* next;
Node(int x = 0) :val(x), next(NULL) {}
};
typedef struct Node* List;
//构造链表
List creat() {
List head = new Node;
List p = head;
int x;
while (cin >> x) {
if (x == -1) {
break;
}
List n = new Node(x);
p->next = n;
p = p->next;
}
return head;
}
//打印链表
void print(List L) {
if (L->next == nullptr) {
cout << "NULL";
return;
}
int k = 0;
while (L->next) {
if (k) {
cout << ' ';
}
k = 1;
cout << L->next->val;
L = L->next;
}
cout << endl;
}
int main()
{
List L1 = creat();
List L2 = creat();
List L3 = new Node;
List ans = L3;
while (L1->next && L2->next) {
if (L1->next->val < L2->next->val) {
L1 = L1->next;
}
else if (L1->next->val > L2->next->val) {
L2 = L2->next;
}
else {
L3->next = new Node(L1->next->val);
L3 = L3->next;
L1 = L1->next;
L2 = L2->next;
}
}
print(ans);
return 0;
}