这是函数题模板。这里写题目要求。
1、已知L1和L2分别指向两个单链表的头结点,其长度分别为m和n。试写一算法将这两个链表连接在一起形成L3,请分析你的算法的时间复杂度。(要求将长的单链表接在短的后面,并且要求空间复杂度o(1)。)
函数接口定义:
在这里描述函数接口。例如:
void connect(LinkList *&L3,LinkList *L1,LinkList *L2);
在这里解释接口参数。例如:L1、L2是已知单链表,合并成一个单链表L3。。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next;
} LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n)
//尾插法建立单链表
{
LinkList *s,*r;
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点
for (int i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));//创建新结点s
s->data=a[i];
r->next=s; //将结点s插入结点r之后
r=s;
}
r->next=NULL; //终端结点next域置为NULL
}
int ListLength(LinkList *L) //求线性表的长度
{
LinkList *p=L;int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
void DispList(LinkList *L) //输出线性表
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void connect(LinkList *&L3,LinkList *L1,LinkList *L2);
int main()
{
LinkList *L3,*L1,*L2;
int n=10,m=8;
ElemType a[]={1,2,3,4,5,6,7,8,9,10};
ElemType b[]={1,2,3,4,5,6,7,8};
CreateListR(L1,a,n);
CreateListR(L2,b,m);
printf("L1:");DispList(L1);
printf("L2:");DispList(L2);
printf("L1,L2->L3\n");
connect(L3,L1,L2);
printf("L3:");DispList(L3);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
L1:1 2 3 4 5 6 7 8 9 10
L2:1 2 3 4 5 6 7 8
L1,L2->L3
L3:1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 10
代码样例:
void connect(LinkList *&L3,LinkList *L1,LinkList *L2) { LinkList *p,*q; int m,n; m=ListLength(L1);
n=ListLength(L2);
if(m<n) {
L3=L1;
p=L1;
q=L2;
}
else {
L3=L2;
p=L2;
q=L1;
}
while (p->next!=NULL)
{
p=p->next;
}
p->next=q->next;
free(q);
}