交集:
void merge_union(LinkList A, LinkList B)
{
LinkList tempA = A;
A = A->next;//指向开始节点
B = B->next;//指向开始节点
while (A&&B)//A为空,说明B链表还有存在数据未插入A。B为空,说明数据已经插入完成了。
{
if (B->data < A->data)//如果B小于A,则在A前插入B
{
LinkList tempB = B->next;//保存B的下一个节点
tempA->next = B;//
B->next = A;
tempA = B;//新插入的节点为A的前一个节点,用于下一次插入操作
B = tempB;//B移动到原B链表的下一个节点
}
else if (B->data == A->data)
{
LinkList tempB = B;
B = B->next;//B指向下一个节点
free(tempB);
}
else//如果A小于B
{
tempA = A;
A = A->next;
}
}
if (B != NULL)
{
tempA->next = B;//tempA保存了A的尾节点
}
}
差集:
void merge_differnce(LinkList A, LinkList B)
{
LinkList priorA = A;
A = A->next;
B = B->next;
//A为待验证链表,B为验证链表
//若B小于A,则移动B,直至大于或者等于A。
//当A==B,说明有交集,备份A的下一个地址,并删除该重复节点
//当B>A,说明当前的A不存在交集,于是移动到下一个A
//当A为空,即A所有元素都被验证完成。
//当B为空,说明所有验证元素都被使用,结束算法!
while (A&&B)
{
if (B->data < A->data)
{
B = B->next;
}
else if (B->data == A->data)
{
LinkList temp = A;
priorA->next = temp->next;//删除节点
A = temp->next;//A节点移动一格
free(temp);
}
else if(B->data > A->data)
{
priorA = A;
A = A->next;
}
}
}