Leetcode(23)合併K個排序連結串列
阿新 • • 發佈:2018-12-11
題目描述
合併 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 NULL; } if(lists.size()==1){ return lists[0]; } if(lists.size()==2){ return mergeTwoLists(lists[0],lists[1]); } int mid = lists.size()/2; vector<ListNode*> sub_list1; vector<ListNode*> sub_list2; for(int i = 0;i<mid;i++){ sub_list1.push_back(lists[i]); } for(int i = mid;i<lists.size();i++){ sub_list2.push_back(lists[i]); } ListNode* l1 = mergeKLists(sub_list1); ListNode* l2 = mergeKLists(sub_list2); return mergeTwoLists(l1,l2); } public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode l(0); ListNode* ptr = &l; while(l1&&l2){ if(l1->val <= l2->val){ ptr->next= l1; // ptr = l1; l1 = l1->next; } else{ ptr->next = l2; //ptr = l2; l2 = l2->next; } ptr =ptr->next; } if(l1){ ptr->next = l1; } if(l2){ ptr->next = l2; } return l.next; } };