15,已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。
思路:采用归并排序思想。在归并思想中,如果A的节点小于B的节点,就把A节点插入到一个地方,指针但是在此处,这个值对我们来说是没有用的,删除即可;如果A的节点等于B的节点,A的指针和B的指针都下移;如果A的节点大于B的节点,此时我们需要对B节点操作,但是,此题中,我们只需要比较值,所以B中无需做什么操作。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<stack>
using namespace std;
// 链表节点结构
typedef struct Node {
int data;
struct Node * next;
Node(): next(NULL) {};
Node(int data):data(data), next(NULL) {};
} Node, *LinkList;
// 输出有头结点的单链表
void show(LinkList L) {
Node *p = L->next;
while(p) {
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
void createCommonList(LinkList &A, LinkList B){
Node *pa = A;
Node *pb = B->next;
while(pa->next && pb){
if(pa->next->data < pb->data){
Node *f = pa->next;
pa->next = f->next;
free(f);
}else if(pa->next->data == pb->data){
pa = pa->next;
}
pb = pb->next;
}
pa->next = NULL;
}
// 头插创建链表
void createListFromHead(vector<int> v, LinkList &L) {
// 创建头
L = new Node();
// 生成链表
for(int i=0; i<v.size(); i++) {
Node *p = new Node(v.at(i));
p->next = L->next;
L->next = p;
}
}
// 尾插创建链表
void careteListFromEnd(vector<int> v, LinkList &L){
// 创建头
L = new Node();
// 设置尾指针
Node *p = L;
// 生成链表
for(int i : v){
Node *q = new Node(i);
p->next = q;
p = q;
}
}
int main() {
int a[]= {1,3,5,7,9,11};
int b[] = {2,3,6,7,10,11};
vector<int> V(a, a+6);
vector<int> V2(b, b+6);
LinkList A, B;
careteListFromEnd(V,A);
careteListFromEnd(V2,B);
LinkList L = new Node();
createCommonList(A, B);
show(A);
return 0;
}