线性表的合并
问题描述:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A=A∪B
算法步骤:依次取出Lb的每个元素,执行以下操作
(1)在Lb中查找该元素
(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)) ListInsert(&La,++La_len,e);
}
}
算法的时间复杂度:O(ListLength(La)ListLength(Lb))
有序表的合并
问题描述:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列
算法步骤:
(1)创建一个空表Lc
(2)依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中的一个表变空为止
(3)继续将另外一个表剩余结点插入到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.elem = new ElemType[LC.length]; //为合并后的新表分配一个数组空间
pc = LC.elem; //指针pc指向新标的第一个元素
pa_last = LA.elem + LA.length-1; //指针pa_last指向LA表的最后一个元素
pb_last = LB.elem + LB.length-1; //指针pb_last指向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表已达到表尾,将LA中剩余元素加入LC
}//MergeList_Sq
算法的时间复杂度是:O(ListLength(La)+(ListLength(Lb))
算法的空间复杂度是:O(ListLength(La)+(ListLength(Lb))
用链表实现
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; //插入剩余段
delete Lb; //释放Lb的头结点
}
算法的时间复杂度是:O(ListLength(La)+(ListLength(Lb))
