LEETCODE: Merge k Sorted Lists
2014-12-13 13:45
134 查看
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
我只能说递归的力量是无穷的,首先我们要解决最基础的,就是两个list 的合并操作。然后,想办法把问题简化到两个,或者小于两个。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *merge2Lists(ListNode *list1, ListNode *list2) {
if(list1 == NULL)
return list2;
if(list2 == NULL)
return list1;
ListNode *newHead = NULL;
if(list1->val < list2->val) {
newHead = list1;
}
else {
newHead = list2;
}
while(list1 != NULL && list2 != NULL) {
ListNode *pre = NULL;
if(list1->val < list2->val) {
while(list1 != NULL && list1->val < list2->val) {
pre = list1;
list1 = list1->next;
}
pre->next = list2;
if(list1 == NULL) {
break;
}
}
else {
while(list2 != NULL && list2->val <= list1->val) {
pre = list2;
list2 = list2->next;
}
pre->next = list1;
if(list2 == NULL) {
break;
}
}
}
return newHead;
}
ListNode *mergeKListsInternal(vector<ListNode *> &lists) {
int size = lists.size();
if(size == 0) return NULL;
if(size == 1) return lists[0];
vector<ListNode *> lefts(lists.begin(), lists.begin() + size / 2);
vector<ListNode *> rights(lists.begin() + size / 2, lists.end());
ListNode *left = mergeKListsInternal(lefts);
ListNode *right = mergeKListsInternal(rights);
return merge2Lists(left, right);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
return mergeKListsInternal(lists);
}
};
我只能说递归的力量是无穷的,首先我们要解决最基础的,就是两个list 的合并操作。然后,想办法把问题简化到两个,或者小于两个。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *merge2Lists(ListNode *list1, ListNode *list2) {
if(list1 == NULL)
return list2;
if(list2 == NULL)
return list1;
ListNode *newHead = NULL;
if(list1->val < list2->val) {
newHead = list1;
}
else {
newHead = list2;
}
while(list1 != NULL && list2 != NULL) {
ListNode *pre = NULL;
if(list1->val < list2->val) {
while(list1 != NULL && list1->val < list2->val) {
pre = list1;
list1 = list1->next;
}
pre->next = list2;
if(list1 == NULL) {
break;
}
}
else {
while(list2 != NULL && list2->val <= list1->val) {
pre = list2;
list2 = list2->next;
}
pre->next = list1;
if(list2 == NULL) {
break;
}
}
}
return newHead;
}
ListNode *mergeKListsInternal(vector<ListNode *> &lists) {
int size = lists.size();
if(size == 0) return NULL;
if(size == 1) return lists[0];
vector<ListNode *> lefts(lists.begin(), lists.begin() + size / 2);
vector<ListNode *> rights(lists.begin() + size / 2, lists.end());
ListNode *left = mergeKListsInternal(lefts);
ListNode *right = mergeKListsInternal(rights);
return merge2Lists(left, right);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
return mergeKListsInternal(lists);
}
};
相关文章推荐
- LeetCode 学习 LinkedList 专项(4)—— Merge Two Sorted Lists
- LeetCode-Merge Two Sorted Lists
- leetcode [64] merge tow sorted lists
- Leetcode题解-23. Merge k Sorted Lists
- leetcode - Merge Two Sorted Lists
- 【Leetcode】【Easy】Merge Two Sorted Lists
- [leetcode] Merge Two Sorted Lists
- leetcode-23. Merge k Sorted Lists
- leetcode23 -- Merge k Sorted Lists
- LeetCode 23 Merge k Sorted Lists(合并k个有序链表)
- leetcode解题方案--021--Merge Two Sorted Lists
- LeetCode - Merge k Sorted Lists
- [#23 leetcode]Merge k Sorted Lists
- leetcode题解-23. Merge k Sorted Lists
- LeetCode No.21 MergeTwoSortedLists
- LeetCode(21)Merge Two Sorted Lists
- [LeetCode]Merge Two Sorted Lists
- leetcode-21-Merge Two Sorted Lists
- LeetCode 之 Merge Two / k Sorted Lists — C/C++ 实现
- leetcode - Merge k Sorted Lists