难度:hard
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题解:题目直接翻译过来就是 mergersort一共k个链表 那么既然它题目已经给出了mergesort的这个提示 那么用merge来排序就不会超过时间复杂度
主要考虑还是要用分治法来做这道题 如果一开始就对整个vector进行操作 那么代码量大 并且也没有体现到分治法的一个思想 于是我先写了一个merge两个ListNode的函数 然后在lists容器的size大于1时 始终对vector的第0个和第1个元素进行merge 将得到的链表压入容器尾部 最后容器的size变为1 这个元素就是我们merge了k个链表得到的独个链表
代码如下:
ListNode* mergeSort(ListNode *l1,ListNode *l2) { if(l1==NULL&&l2!=NULL) return l2; else if(l2==NULL&&l1!=NULL) return l1; else if(l1==NULL&&l2==NULL) return NULL; int x=0; if(l1->val>=l2->val) {x=l2->val;l2=l2->next;} else {x=l1->val;l1=l1->next;} ListNode *result=new ListNode(x); ListNode *head=new ListNode(0); head=result; while(1){ if(l1==NULL) { if(l2==NULL) break; else if(l2!=NULL) { head->next=l2; l2=l2->next; head=head->next; } } else if(l2==NULL) { head->next=l1; l1=l1->next; head=head->next; } else{ if(l1->val>=l2->val) { head->next=l2; l2=l2->next; head=head->next; } else{ head->next=l1; l1=l1->next; head=head->next; } } } return result; } ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.size()==0) return NULL; else if(lists.size()==1&&lists[0]==NULL) return NULL; while(1) { if(lists.size()==1) break; else{ ListNode *p=new ListNode(0); p=mergeSort(lists[0],lists[1]); lists.push_back(p); lists.erase(lists.begin()); lists.erase(lists.begin()); } } return lists[0]; } 一开始没用这个方法而是直接对所有元素进行处理的时候 好像是会Error 空间超出限制 非常迷茫 本来查了一个free函数用来释放空间 包含在C语言的.h文件 后来一交过了 所以现在用的这个方法估计不止时间复杂度满足条件 空间复杂度也满足条件