[23. 合并K个升序链表](https://leetcode-cn.com/problems/merge-two-sorted-lists/)
1.顺序合并
-
根据合并两个有序链表的策略,我们每次找出当前所有链表中头节点比较大的那一个,连接到结果中。时间复杂度主要来源于K个链表的查找,复杂度为O(K2N)。这种方法比较简单直接。
-
class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode *result=new ListNode; ListNode *head=result; int i,min_i; while(1){ int min_val=INT_MAX; ListNode *min_head; for(int i=0;i<lists.size();i++){ if(lists[i]==nullptr){ continue; } if(min_val>lists[i]->val){ min_val=lists[i]->val; min_i=i; } } if(min_val==INT_MAX){ break; } head->next=lists[min_i]; lists[min_i]=lists[min_i]->next; head=head->next; } return result->next; } };
2.优先队列
-
可以使用优先队列保存K个链表中值最小的List Node,每次取出优先队列中最小的那一个连接,时间复杂度O(KN),空间复杂度O(K)。
-
注意优先队列重载结构体时的排序方式写法:
-
class Solution { public: struct Node{ int val; ListNode *temp; bool operator <(const Node &A) const{ return val>A.val; } }; priority_queue<Node> pq; ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode *result=new ListNode(); ListNode *head=result; // for(auto it=lists.begin();it!=lists.end();it++){ for(auto it:lists){ if(it!=nullptr){ pq.push({it->val,it}); } } while(!pq.empty()){ Node min_ListNode=pq.top(); pq.pop(); head->next=min_ListNode.temp; head=head->next; if(min_ListNode.temp->next!=nullptr){ pq.push({min_ListNode.temp->next->val,min_ListNode.temp->next}); } } return result->next; } };