转载请注明出处:http://write.blog.csdn.net/postedit/52728077
原题:Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
解答:
C++版本
class Solution {public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if (lists.size() == 0) return NULL;
queue<ListNode *> q;
for (auto n : lists)
q.push(n);
while (q.size() > 1) {
ListNode *l1 = q.front(); q.pop();
ListNode *l2 = q.front(); q.pop();
q.push(mergeTwoLists(l1, l2));
}
return q.front();
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == NULL) return list2;
else if (list2 == NULL) return list1;
ListNode dummy(0);
ListNode* current = &dummy;
while (list1 != NULL && list2 != NULL) {
if (list1->val <= list2->val) {
current->next = list1;
list1 = list1->next;
}
else {
current->next = list2;
list2 = list2->next;
}
current = current->next;
}
if (list1 != NULL) current->next = list1;
if (list2 != NULL) current->next = list2;
return dummy.next;
}
};
思路:
比如原lists中又6个序列,分别是s1-s6,存入deque,则他们的处理顺序是
1--合并s1和s2,结果s12加入queue,queue中元素为
s3 s4 s5 s6 s12 (queue中前两个元素合并后被移除)
2--合并s3和s4,结果s34加入queue,queue中元素为
s5 s6 s12 s34
3--合并s5和s6,结果s56加入queue,queue中元素为
s12 s34 s56
4--合并s12和s34,结果s1234加入queue,queue中元素为
s56 s1234
5--合并s56和s1234,结果s123456加入queue,queue中元素为
s123456 (元素个数为1,可以返回)
注意:
1、在合并两个序列时,设置一个头结点dummy非常方便。
Java版本:
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if (lists==null||lists.size()==0) return null;
PriorityQueue<ListNode> queue= new PriorityQueue<ListNode>(lists.size(),new Comparator<ListNode>(){
@Override
public int compare(ListNode o1,ListNode o2){
if (o1.val<o2.val)
return -1;
else if (o1.val==o2.val)
return 0;
else
return 1;
}
});
ListNode dummy = new ListNode(0);
ListNode tail=dummy;
for (ListNode node:lists)
if (node!=null)
queue.add(node);
while (!queue.isEmpty()){
tail.next=queue.poll();
tail=tail.next;
if (tail.next!=null)
queue.add(tail.next);
}
return dummy.next;
}
}
思路:
使用优先队列的方式来排序,优先队列基于堆排序,如果元素是自定义类类型,需要重写比较函数。先举例说明
例如:lists中有3个序列,分别是
2 4 8 10
3 5 12 14
7 13 15 19
1--执行完 if (node!=null)
queue.add(node);
queue中就有了各序列的首元素,且为升序
2 3 7
2--执行while中 tail.next=queue.poll()后,首元素2弹出,被tail接收
queue中还是两个元素为 3 7
3--执行完if (tail.next!=null)
queue.add(tail.next);
tail此时就是2,后续元素为4,进入queue,元素又变为3个
3 4 7
4--重复上面操作,tail变为3,queue中3弹出,3后面元素5进入queue
重复上面操作,直到各序列均到达尾部。
注意:
1、代码中,比较函数采用匿名函数的形成书写