21. 合併兩個有序連結串列/23. 合併K個排序連結串列
阿新 • • 發佈:2019-01-01
1.合併兩個有序連結串列
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* Phead = new ListNode(0);
ListNode* l3 = Phead;
while (l1&&l2)
{
if (l1->val<l2->val)
{
l3->next = l1;
l1 = l1->next;
}
else
{
l3->next = l2;
l2 = l2->next;
}
l3 = l3->next;
}
if (l1)l3->next = l1;
if (l2)l3->next = l2;
return Phead->next;
}
2.合併K個排序連結串列
分析:採用分治法,最後兩兩合併。
c++ leetcode ac:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int len = lists.size();
if (len == 0)return nullptr;
if (len == 1)return lists[0];
return Partion(lists,0,len-1);
}
ListNode* Partion(vector<ListNode*>& lists,int low,int high)
{
int mid = (low + high) / 2;
if (low == high)return lists[low];
if (low < high)
{
ListNode* left = Partion(lists, low, mid);
ListNode* right = Partion(lists,mid+1,high);
return mergeTwoLists(left, right);
}
return nullptr;
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* Phead = new ListNode(0);
ListNode* l3 = Phead;
while (l1&&l2)
{
if (l1->val<l2->val)
{
l3->next = l1;
l1 = l1->next;
}
else
{
l3->next = l2;
l2 = l2->next;
}
l3 = l3->next;
}
if (l1)l3->next = l1;
if (l2)l3->next = l2;
return Phead->next;
}
};