合并K个排序链表
Posted tianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并K个排序链表相关的知识,希望对你有一定的参考价值。
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.empty()) return nullptr; for(int i=1;i<lists.size();++i) mergeLists(lists[0],lists[i]); return lists[0]; } private: ListNode* mergeLists(ListNode* &l1,ListNode *l2) { if(!l1&&!l2) return nullptr; else if(!l1||!l2) return l1?l1:l1=l2; ListNode* head=new ListNode(-1); ListNode* H=head; while(l1&&l2) { if(l1->val<=l2->val) { H->next=l1; H=H->next; l1=l1->next; } else { H->next=l2; H=H->next; l2=l2->next; } } H->next=l1?l1:l2; l1=head->next; head->next=nullptr; delete head; return l1; } };
堆排序
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.empty()) return nullptr; ListNode head(-1); ListNode *H=&head; make_heap(lists.begin(),lists.end(),cmpNode); while(!lists.empty()&&lists.front()) { pop_heap(lists.begin(),lists.end(),cmpNode); H->next=lists.back(); H=H->next; lists.back()=lists.back()->next; if(!lists.back()) lists.pop_back(); else make_heap(lists.begin(),lists.end(),cmpNode); } return head.next; } static bool cmpNode(ListNode *l1,ListNode *l2) { if(!l1||!l2) return !l1?true:false; return l1->val>=l2->val; } };
以上是关于合并K个排序链表的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):链表类:第23题:合并K个排序链表:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。