已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。

已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。

时间复杂度:O(min(m,n))

LinkList* connect(LinkList *ha,LinkList *hb,int m,int n){
    LinkList *hc,*rear;
    if(m>n){
        hc = ha;
        rear = hb;
    }else{
        hc = hb;
        rear = ha;
    }
    LinkList* head = hc;
    while(hc->next!=NULL)
        hc = hc->next;
    hc->next = rear->next;
    free(rear);
    ha = hb = NULL;
    return head;
}

/** 看了评论,很多人说代码有问题,我检查了一下,暂时没有什么问题,当然也可能是我对题目的理解有问题。 */

并赋一下我写的完整代码:

#include<iostream>
using namespace std;

typedef struct Node{
    int value;
    Node* next;
}LinkList;

//ha,hb均为带头节点的链表
LinkList* connect(LinkList *ha,LinkList *hb,int m,int n){
    LinkList *hc,*rear;
    if(m>=n){
        hc = ha;
        rear = hb;
    }else{
        hc = hb;
        rear = ha;
    }
    LinkList* head = hc;
    while(hc->next!=NULL)
        hc = hc->next;
    hc->next = rear->next;
    free(rear);
    ha = hb = NULL;
    return head;
}
   
//创建链表 
LinkList* createList(int arr[],int n){
    //尾插法
    LinkList* rear;
    LinkList* L;
    L = new LinkList;
    rear = L;
    for(int i=0;i<n;i++){
        LinkList* tmp = new LinkList;
        tmp->value = arr[i];
        rear->next = tmp;
        rear = rear->next;
    }
    rear->next = NULL;
    return L;
}


int main(){

    int a[] = {1,5,6,2,1,7};
    int b[] = {7,3,12,2,9,8,11};
    LinkList* L1 = createList(a,sizeof(a)/sizeof(a[0]));
    LinkList* L2 = createList(b,sizeof(b)/sizeof(b[0]));
    LinkList* L = connect(L1,L2,sizeof(a)/sizeof(a[0]),sizeof(b)/sizeof(b[0]));

    L = L->next;
    while(L != NULL){
        cout<<L->value<<" ";
        L = L->next;
    }

}



   

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值