LeetCode之23---Merge k Sorted Lists
题目:
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
题目大意:
给定k条有序链表,求k条链表有序合并后的链表。
思路:
看到这道题感觉蛮亲切的,因为已经不止一次遇到链表有序合并的问题了,所以思路还是有的。
第一个思路就是借助两个链表的合并,先将两个链表合并为结果链表,然后再将下一条链表合并到结果链表上,直到所有的链表都合并结束。
当然,第一个思路的时间复杂度很高,所以肯定又是轰轰烈烈的超时了。所以,诞生了第二个思路:根据合并排序的思想,将链表从头和尾合并,每次合并之后都放在原来链表数组的前半部分,下一次循环直接合并前半部分,直到所有的链表合并完成。
代码1:
//每次合并一个链表到结果链表上,结果超时 class Solution { public: ListNode* mergeKLists(std::vector<ListNode*>& lists) { ListNode *result = nullptr; const int size = lists.size(); if (size == 0) { return result; } else if (size == 1) { return lists[0]; } result = lists[0]; for (int i = 1; i < size; ++i) { result = mergeTwoLists(result, lists[i]); } return result; } private: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) //合并两个数组 { ListNode *result = new ListNode(0); ListNode *p1 = l1; ListNode *p2 = l2, *tail = result; while (p1 && p2) { if (p1->val <= p2->val) { tail->next = p1; p1 = p1->next; } else { tail->next = p2; p2 = p2->next; } tail = tail->next; } if (p1) { tail->next = p1; p1 = p1->next; } if (p2) { tail->next = p2; p2 = p2->next; } tail = result; result = tail->next; delete(tail); return result; } };
代码2:
class Solution { public: ListNode* mergeKLists(std::vector<ListNode*>& lists) { const int size = lists.size(); if (size == 0) { return nullptr; } int right = size - 1; while (right > 0) { int left = 0; while (left < right) { lists[left] = mergeTwoLists(lists[left], lists[right]); ++left; --right; } } return lists[0]; } private: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode *result = new ListNode(0); ListNode *p1 = l1; ListNode *p2 = l2, *tail = result; while (p1 && p2) { if (p1->val <= p2->val) { tail->next = p1; p1 = p1->next; } else { tail->next = p2; p2 = p2->next; } tail = tail->next; } if (p1) { tail->next = p1; p1 = p1->next; } if (p2) { tail->next = p2; p2 = p2->next; } tail = result; result = tail->next; delete(tail); return result; } };