题目描述
将两个递增的有序链表合并为一个递增的有序链表,要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间,表中不允许有重复的数据。
算法思想
当两个链表La,Lb均未达到尾结点时,用后插法摘取较小者重新链接在Lc表的最后;当两表元素相等时,摘取La表中的元素,删除Lb中的元素,这样确保无重复元素;当一个表达到尾结点时,将非空表的剩余元素直接链接到Lc表的最后,最后释放Lb的头节点。
代码演示
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
pa=La->next;
pb=Lb->next; //将pa,pb初始化为La,Lb的首元结点
Lc=pc=La; //用La的头节点作为Lc的头节点
while(pa&&pb){ //La和Lb均未到达尾节点
if(pa->date<pb->date){
pc->next=pa;
pc=pa;
pa=pa->next;// 尾插法将pa指向的结点链接到Lc之后
}
else if(La->date>Lb->date){
pc->next=pb;
pc=pb;
pb=pb->next;
}
else{ //数据相等
Lc->next=pa;
pc=pa;
pa=pa->next;
q=pb->next; //为了pb=pb->next,防止删除后找不到pb
delete pb;
pb=q;
}
}
pc->next=pa?pa:pb; //将剩余元素链接到Lc的最后
delete Lb; //删除Lb的头结点
}
附:代码是自己参考资料结合自身理解,若发现错误,欢迎广大码友指出改正。