2个单链表的合并

这是函数题模板。这里写题目要求。
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);
}

 

 

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值