1、用顺序表实现
算法:(1)创建空表Lc
(2)依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
(3)继续将La或Lb其中一个表的剩余结点插入到Lc表的最后
//有序表的合并
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
int *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem; //指针pa指向La第一个元素
pb=Lb.elem;
pa_last=La.elem+La.length-1; //指针pa_last指向La最后一个元素
pb_last=Lb.elem+Lb.length-1;
Lc.length=La.length+Lb.length;
Lc.elem=new int[Lc.length];
pc=Lc.elem;
while(pa<=pa_last&&pb<=pb_last){ //若Lc和Lb都非空
if(*pa<=*pb) *pc++=*pa++; //摘取较小元素放到Lc中
else *pc++=*pb++;
}
while(pa<=pa_last) *pc++=*pa++; //La中有剩余元素
while(pb<=pb_last) *pc++=*pb++;
}
运行结果
2、用链表实现
//合并有序表(链表)
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
Lnode *pa=La->next,*pb=Lb->next;
Lnode *pc=Lc=La; //用La头结点作Lc头结点,指针pc指向Lc头结点
while(pa&&pb){
if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;} //比较pa\pb所指数据大小
else{pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=pa?pa:pb; //插入剩余结点
delete Lb; //释放Lb头结点
}
运行结果