问题描述:
线性表的合并:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A =
有序表的合并:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列
线性表的合并:
算法步骤:依次取出Lb中的每个元素,执行以下操作:
1、在La中查找该元素
2、查找不到,插入La的表尾
//伪代码
void union(List &La, List Lb){
La_len = ListLength(La);
Lb_len = ListLength(Lb);
for(i = 1; i <= Lb_len;i++){
GetElem(Lb,i,e);
if(!LocateElem(La,e))
Listlnsert(&La,++La_len,e);
}
}
有序表的合并:
算法步骤:
1、创建一个空表Lc
2、依次从La或Lb中选取元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
3、继续将La或Lb其中一个表的剩余结点插入在Lc表的最后
顺序表实现:
借助两个指针pa和pb分别指向两个有序表La的首元素,Lb的首元素。比较两个指针所指元素大小,将小的值赋给Lc,该处指针向后移动,继续比较。
//伪代码
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
pa = La.elem;
pb = Lb.elem;//指针pa和pb的初值分别指向两个表的第一个元素
Lc.length = La.length + Lb.length//新表长度为两个表长度之和
Lc.elme = new ElemType[Lc.length]//为合并的新表分配数组空间
pc = Lc.elem;//pc指向新表的第一个元素
pa_last = La.elem+La.length-1//指向La表最后一个元素,为了判断是否表读完
pb_last = Lb.elem+Lb.length-1//指向Lb表最后一个元素,为了判断是否表读完
while(pa<=pa_last&&pb<=pb_last){//两个表都不为空
if(*pa<=*pb)*pc++ = *pa++; //依次摘取两表中值较小的结点
else *pc++ = *pb++;
}
while(pa<=pa_last)*pc++ = *pa++;//Lb表已到达表尾,将La中剩余元素加入Lc
while(pb<=pb_last)*pc++ = *pb++;//La表已到达表尾,将Lb中剩余元素加入Lc
}
时间复杂度:O(ListLength(La)+ListLength(Lb))
空间复杂度:O(ListLength(La)+ListLength(Lb))
链表实现:假设用La的头结点作为Lc的头结点
//伪代码
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
pa = La->next;
pb = Lb->next;
pc = Lc = La//用La的头结点作为Lc的头结点
while(pa&&pb){
if(pa->data<=pb->data){
pc -> next = pa;
pc = pa;
pa = pa -> next;
}
else{
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
pc ->next =(pa?pa:pb)//插入剩余段
free(Lb);//释放Lb的头结点
}