题目
设有两个无头结点的单链表,头指针分别为ha、hb,链表中有数据域data,链域next,两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。
分析
这一题真正体会到了头结点的重要性,hb在算法中不允许被修改,果断为ha添加头结点(不添加头结点操作想了两个小时,感觉炸了),添加之后,插入才能很好进行,当然可以尝试一下不添加头结点的后果(最起码在第一个结点之前插入时很麻烦,把这个问题解决了,其实也简单),算法完成后把头结点删除即可。
思路就是比较ha和hb相应结点的值,如果相等,ha和hb都向后移动,ha的值小于hb的值,ha向后移动,ha的值大于hb的值,申请一个结点保存hb对应结点数据,插入到ha中,hb向后移动。
代码
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode * next;
}LNode, *LinkList;
void mergeList(LinkList &ha, LinkList hb){
///为链表ha添加头结点
LNode *p = (LinkList)malloc(sizeof(LNode));
p -> next = ha;
ha = p;
p = ha -> next;
LNode *p1 = ha, *q = hb;///p指向ha的头结点的下一个结点,q指向hb头结点
while(p && q) {
if(p -> data == q -> data) {///值相等,对应指针移动
p = p -> next;
q = q -> next;
p1 = p1 -> next;
}else if(p -> data < q -> data) {
p = p -> next;
p1 = p1 ->next;
}else if(p -> data > q -> data) {
LNode *temp = (LinkList)malloc(sizeof(LNode));
temp -> data = q -> data;
temp -> next = p;
p1 -> next = temp;
p1 = p1 -> next;
q = q -> next;
}
}
ha = ha -> next;
}
源代码
http://123.206.59.223:8080/code/code/9.rar