算法的思想
1.需要合并的两个链表La,Lb,合并之后的链表Lc(用La的头节点)。
2.定义两个辅助指针Pa,Pb分别是链表La,Lb的复制指针。
3.从首元节点开始比较,当两个链表都没有到达链表尾部的时候,依次取其中较小的数据进行链接到Lc的最后
4.如果两个元素的值相同,取La链的,把Lb链表的元素删除(确保新链表没有重复的元素)
5.当一个链表结束的时候,把非空链表剩余的所有元素链接在Lc表的最后
6.释放Lb的头节点(Lb链表就被删除了)
代码实现+注释
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while (pa && pb)
{
if (pa->data < pb->data)
{
//把小的数据(pa)链接到Lc表上
pc->next = pa;
pc = pa; //保证指向最后的节点上
pa = pa->next; //指针后移
}
else if (pa->data > pb->data)
{
//把小的数据(pb)链接到Lc表上
pc->next = pb;
pc = pb;
pb = pb->next;
}
else
{
//如果两个元素的值相同,取La链的,把Lb链表的元素删
pc->next = pa;
pc = pa;
pa = pa->next;
LNode *p = pb->next; //保存pb下一个节点
delete (pb);
pb = p;
}
}
pc->next = pa?pa:pb;
delete(Lb);
}