已知指针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;
    }

}



   

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐