题目
已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放在A链表中。
题解
取出工作指针pa和pb分别指向链表A和B的首元结点,进行pa和pb比较:
(如果数据相等则同时存在,为交集元素。如果比较小于,则不可能为交集元素后移删除。)
- pa指针的数据等于pb指针的数据。Lc指向pa,pa、pb后移,删除pb。
- pa指针的数据小于pb指针的数据。pa后移,删除pa。
- pa指针的数据大于pb指针的数据。pb后移,删除pb。
当其中一个指针到达链表尾部,将另一个链表的空间释放。
/*
已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放在A链表中
*/
#include <iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
void createList(LinkList &L) {
L = new LNode;
L->next = NULL;
cout << "创建链表元素的个数:";
int n;
cin >> n;
cout << "创建链表的元素:";
LinkList p = NULL, pc = L;
for (int i = 0; i < n; ++i) {
p = new LNode;
cin >> p->data;
p->next = pc->next;
pc->next = p;
pc = p;
}
}
void mergeList(LinkList &La, LinkList &Lb, LinkList &Lc) {
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc = Lc = La, q;
while (pa && pb) {
if (pa->data == pb->data) {
// Lc执行pa
pc->next = pa;
pc = pa;
// pa后移
pa = pa->next;
// pb后移,删除pb
q = pb;
pb = pb->next;
delete q;
} else if (pa->data < pb->data) {
q = pa;
pa = pa->next;
delete q;
} else {
q = pb;
pb = pb->next;
delete q;
}
}
while (pa) {
q = pa;
pa = pa->next;
delete q;
}
while (pb) {
q = pb;
pb = pb->next;
delete q;
}
pc->next = NULL;
delete Lb;
}
void printList(LinkList L) {
cout << "链表的元素是:";
LinkList p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LinkList La = NULL, Lb = NULL, Lc = NULL;
cout << "链表La:" << endl;
createList(La);
cout << "链表Lb:" << endl;
createList(Lb);
printList(La);
printList(Lb);
mergeList(La, Lb, Lc);
cout << "合并后的链表:" << endl;
printList(Lc);
return 0;
}