-
题目描述
设ha和hb分别是两个带附加头结点的非递减有序单链表的表头指针,设计函数使这两个有序链表合并为一个非递增有序单链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复数据。 -
算法思想
利用归并排序将hb的元素头插ha,其中利用q作为中介使ha成为合并链表。 -
问题与解决
1.不能利用新空间
利用q作为中介,把元素头插入ha的first,最后删除q。
2.两链表出现相同值时,输出的合并链表只有元素的值只有一个且长度无限
q得到pa(pb)的地址后,马上将pa(pb)后移,再进行头插,以免改变pa(pb)地址。
3.析构时出错
析构ha后,hb中元素已被析构,这时若继续析构hb,则会出错,故直接令hb->next=NULL。
- 代码实现
template
bool List::Merge(Node* hb) {
Node* pa = first->next;
Node* pb = hb->next;
Node* q;
if (pa == NULL && pb == NULL)return false;
if (pa->data < pb->data) {
pa = pa->next;
}
else {
q = pb;
pb = pb->next;
q->next = first->next;
first->next = q;
}
first->next->next = NULL;//输出时的结束点
//归并排序
while (pa != NULL && pb != NULL) {
if (pa->data < pb->data) {
q = pa;
pa = pa->next;
}
else {
q = pb;
pb = pb->next;
}
q->next = first->next;
first->next = q;
}
while (pa != NULL) {
q = pa;
pa = pa->next;
q->next = first->next;
first->next = q;
}
while (pb != NULL) {
q = pb;
pb = pb->next;
q->next = first->next;
first->next = q;
}
//删除多余空间
q = NULL;
delete q;
hb->next = NULL;//防止二次析构
return 1;