【例】 A和B是两个单链表(带表头结点),其中元素递增有序。设计一个算法,将A和B归并成一个按元素递增有序的链表C,C由A和B中的结点组成。
/* 关键点:尾插法 */
void merge(LNode *A,LNode *B,LNode *&C){ // merge :合并,融合
LNode *p=A->next;
LNode *q=B->next;
//以下四行在尾插法中常见,即 创建头结点 和 设置尾指针
LNode *k;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
k=C;
while(p!=NULL && q!=NULL){
if(p->data<=q->data){ //将值最小的结点连接在单链表 C上
k->next=p;
p=p->next;
k=k->next;
}else{
k->next=q;
q=q->next;
k=k->next;
}
}
if(p!=NULL) //若链表A长于链表B,则将比较完后A长出来的部分连接在C上
k->next=p;
if(q!=NULL) //若链表B长于链表A,则将比较完后B长出来的部分连接在C上
k->next=q;
}
假如这里修改一下例的题干,将归并成一个递增的链表C改为归并成一个递减的链表C,那么如何解决呢?
/* 关键点:头插法 */
void merge(LNode *A,LNode *B,LNode *&C){
LNode *p=A->next;
LNode *q=B->next;
LNode *s;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
while(p!=NULL && q!=NULL){
if(p->data<=q->data){
s=p; //注意s
s->next=C->next;
C->next=s;
p=p->next;
}else{
s=q;
s->next=C->next;
C->next=s;
q=q->next;
}
}
while(p!=NULL){
s=p;
s->next=C->next;
C->next=s;
p=p->next;
}
while(q!=NULL){
s=q;
s->next=C->next;
C->next=s;
q=q->next;
}
}