题目
两个按元素递增次序排列的单链表,编写算法将两个单链表合并为一个按元素递减次序排列的单链表
并要求利用原来两个单链表的结点存放归并后的单链表
代码
//两个按元素递增次序排列的单链表,编写算法将两个单链表合并为一个按元素递减次序排列的单链表
//并要求利用原来两个单链表的结点存放归并后的单链表
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void createLinkList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
LNode *p,*r=L;
ElemType e;
cin>>e;
while(e!=999){
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
r->next=p;
r=p;
cin>>e;
}
r->next=NULL;
}
void dispLinkList(LinkList L){
LNode *p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//算法主体
//使用头插法构造链表
void MergeAandB(LinkList &LA,LinkList &LB){
if(LA==NULL&&LB==NULL)
return;
LNode *pa=LA->next,*pb=LB->next,*q;
LA->next=NULL;
while(pa&&pb){
if(pa->data<pb->data){
q=pa->next; //暂存pa的后继,防止断链
pa->next=LA->next;
LA->next=pa;
pa=q;
}else{
q=pb->next;
pb->next=LA->next;
LA->next=pb;
pb=q;
}
}
while(pa){
q=pa->next;
pa->next=LA->next;
LA->next=pa;
pa=q;
}
while(pb){
q=pb->next;
pb->next=LA->next;
LA->next=pb;
pb=q;
}
}
int main() {
LinkList LA,LB;
createLinkList(LA);
createLinkList(LB);
dispLinkList(LA);
dispLinkList(LB);
MergeAandB(LA,LB);
dispLinkList(LA);
return 0;
}