问答题
有两个单链表La和Lb,La中有m个元素,Lb中的元素个数为n。已知两个链表均为递增的单向链表。现想将两个链表归并成一个递增的单向链表,且希望利用原来的结点空间,请回答下列问题:
问答题
给出算法的主要思想;
【正确答案】基本思想:遍历链表La和Lb,将其元素值进行比较,再合并成一个递增的单向链表。
【答案解析】
问答题
写出算法的实现函数;
【正确答案】算法的实现如下:
链表结点定义为:
struct node{
int value;
struct node * Next;
};
struct node * merge( struct node *a, struct node *b){
struct node *p;
struct node *q;
struct node *t;
if(a->value<=b->value){ //比较当前指针所指值的大小
p=a;
q=b;
} else{
p=b;
q=a;
}
t=p;
while(q){ //如果b链表先结束,那么将a链表剩余结点全部合并到新链表
if(p->Next==NULL){
p->Next=q;
break;
}
if(q->value<p->Next->value){
struct node * k=q->Next;
q->Next=p->Next;
p=p->Next;
q=k;
continue;
}
p=p->Next;
}
return t:
}
【答案解析】
问答题
总结所用算法的时间和空间复杂度。
【正确答案】遍历链表的时间复杂度为O(max(m,n)),算法实现过程中使用的辅助空间为常量,空间复杂度为O(1)。
【答案解析】