第6关:两个有序顺序表的合并操作
任务描述
本关任务:分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序顺序表,编写将这两个有序顺序表合并成为一个大的有序顺序表的合并操作函数。
相关知识
已知有两个按元素值递增有序的顺序表A和B。设计一个算法将顺序表A和B的全部元素归并到一个按元素递增有序的顺序表C中。
算法思想:用i遍历顺序表A,用j遍历顺序表B。当A和B都未遍历完时,比较两者的当前元素,则将较小者复制到C中,若两者的当前元素相等,则将这两个元素都复制到C中。最后将尚未遍历完的顺序表的余下元素均复制到顺序表C中。
本算法的空间复杂度为O(1),时间复杂度为O(n+m),其中n和m分别为顺序表A和B的长度。
要注意,如果顺序表中数据类型ElemType是结构体类型,结构体变量之间整体是不可以比较大小的,结构体变量之间只能比较某个成员的大小;比较两个结构体变量是否相等与比较两个结构体变量某个成员的大小也是有区别的。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,完成两个有序顺序表的合并操作函数的定义:
-
int MergeList(SqList La, SqList Lb, SqList &Lc) ;// 归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列。
测试说明
平台会对你编写的代码进行测试:
测试输入: 5 10 15 20 25 30 6 12 22 32 42 52 62
输入说明 第一行输入有序表A的长度M; 第二行依次输入有序表A的M个有序的整数; 第三行输入有序表B的长度N; 第四行依次输入有序表B的N个有序的整数。
预期输出: 合并两个有序顺序表: 10 12 15 20 22 25 30 32 42 52 62
输出说明 第一行输出提示信息; 第二行输出合并后的有序顺序表所包含的M+N个有序的整数。
开始你的任务吧,祝你成功!
int MergeList(SqList La, SqList Lb, SqList &Lc) { // 已知顺序线性表La和Lb的元素按值非递减排列。 // 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。 /********** Begin **********/ Lc.length=La.length+Lb.length; Lc.elem=new ElemType[Lc.length]; int *pa=La.elem; int *pb=Lb.elem; int *pc=Lc.elem; int *pa_last=La.elem+La.length-1; int *pb_last=Lb.elem+Lb.length-1; while((pa<=pa_last)&&(pb<=pb_last)) { if(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } while(pa<=pa_last) *pc++=*pa++; while(pb<=pb_last) *pc++=*pb++; /********** End **********/ }
下一篇:
腾讯面试算法题——编码