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