思考过程
根据题意可知我们只需要找L1链表和L2链表之间的共同元素就行了,不符合要求的元素我们就把它删掉。
-
首先需要p1和p2指针分别用来指向L1和L2链表的下一结点,另外还需要一个r结点用来指向L1。
编辑
-
如果p1->data小于p2->data的话我们就把p1现在指向的结点删掉,这时候我们需要用到新的指针q来删除结点,同理如果p2->data小于p1->data时我们也用相同的方式把p2指向的元素删除。
编辑
-
如果p1->data等于p2->data就表明该元素就是我们想要的元素,我们就把它与L1的前一元素链接,同时把L2中的该元素删掉。
编辑
-
最后如果一个链表遍历完为空了但是另一个链表中还有元素,那么剩余的元素也不可能是两个链表中相同的元素,我们直接把剩余的元素删掉。
编辑
最后完整代码附上
#include "iostream"
struct node
{
int data;
struct node *next;
};
int a[6] = {1,3,4,5,10,11};
int n = 6;
int b[5] = {3,5,7,9,10};
int m = 5;
//以上只是我举的例子
//创建链表A
void CreateA(struct node *L)
{
struct node *s;
struct node *r = L;
for (int i = 0; i < n; i++)
{
s = (struct node *)malloc(sizeof(struct node));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
//创建链表B
void CreateB(struct node *L)
{
struct node *s;
struct node *r = L;
for (int i = 0; i < m; i++)
{
s = (struct node *)malloc(sizeof(struct node));
s->data = b[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
//打印输出方便我看结果
void display(struct node *L)
{
struct node *s = L->next;
while (s)
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
}
//求交集
void merge_list(struct node *A, struct node *B)
{
struct node *r, *q;
r = A;
struct node *p1 = A->next;
struct node *p2 = B->next;
while (p1 && p2)
{
if (p1->data < p2->data)
{
q = p1;
p1 = p1->next;
free(q);
}
else if (p1->data == p2->data)
{
r->next = p1;
r = p1;
p1 = p1->next;
q = p2;
p2 = p2->next;
free(q);
}
else
{
q = p2;
p2 = p2->next;
free(q);
}
}
while (p1)
{
q = p1;
p1 = p1->next;
free(q);
}
while (p2)
{
q = p2;
p2 = p2->next;
free(q);
}
r->next = NULL;
}
int main()
{
struct node *A;
struct node *B;
CreateA(A);
CreateB(B);
display(A);
display(B);
merge_list(A, B);
display(A);
return 0;
}