写代码中碰到的问题:
1、忽略了原来两条链表的最后一个结点的next=NULL。
第一次失败:多加了p3->next=NULL;导致程序错误。
第二次失败while(p1),while(p2)中让:p3->next=p1->next ; p3->next=p2->next;
思想:1、通过(新链表L3)的next连接L1,L2中的结点。
2、用p3(指向L3)来防止断链。
linklist mergeAscend(linklist L1,linklist L2)
{ linklist p1=L1->next,p2=L2->next,p3,L3,head;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
L3=head;
p3=L3;
while(p1&&p2){
if(p1->info<p2->info){
p3->next=p1;
p1=p1->next;
}
else{
p3->next=p2;
p2=p2->next;
}
p3=p3->next;
}
while(p1){
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
while(p2){
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
return head;
}
降序排列是在升序排列的基础上做的改善。(相当于站在巨人的肩膀上)
思想:1、对于题目中原有的升序单链表,先升序。
2、单链表的逆置。
linklist mergeDescend(linklist L1,linklist L2)
{
linklist p1=L1->next,p2=L2->next,p3,L3,head,p,s;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
L3=head;
p3=L3;
while(p1&&p2){
if(p1->info<p2->info){
p3->next=p1;
p1=p1->next;
}
else{
p3->next=p2;
p2=p2->next;
}
p3=p3->next;
}
while(p1){
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
while(p2){
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
p=L3->next;
L3->next=NULL;
while(p){
s=p;
p=p->next;
s->next=L3->next;
L3->next=s;
}
return L3;
}