【LeetCode练习题】Merge k Sorted Lists

Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

 

题目意思:

合并K条已经排序的链表。分析时间复杂度。

 

解题思路:

很容易就想起之前学的合并两条链表的算法,这一题其实就是那个题目的扩展,变成合并K条了。我采用的方法就是迭代法。

如果只有一条,直接返回。如果只有两条,就只需要调用mergeTwo一下。如果超过两条链表的话,先将前两个链表调用mergeTwo,然后用新的链表和第三个链表调用mergeTwo,再用结果和第四个链表调用mergeTwo,依次调用到最后一个链表。

时间复杂度貌似是O(n2)……有点慢。Orz~不过AC了。

有一点就是我这里用来合并两个链表的方法mergeTwo是用递归实现的(《剑指offer》第116页中代码),课本上是用循环的。大家可以参考一下。

 

其实更有效率的方法就是归并法,即先lists分成一半,再分成一半,直到分成只有两个了再调用一下mergeTwo。这样效率会高很多。mark一下,该方法代码以后看心情补上。

 

代码如下:

 1 class Solution {
 2 public:
 3     ListNode *mergeKLists(vector<ListNode *> &lists) {
 4         if(lists.size() == 1){
 5             return lists[0];
 6         }   
 7         if(lists.size() == 2){
 8             ListNode *ret;
 9             ret = mergeTwo(lists[0],lists[1]);
10             return ret;
11         }
12         if(lists.size() > 2){
13             ListNode *p = NULL;
14             p = mergeTwo(lists[0],lists[1]);
15             for(int i = 2; i < lists.size(); i++){
16                 p = mergeTwo(p,lists[i]);
17             }
18             return p;
19         }
20     }
21     
22     ListNode *mergeTwo(ListNode *list1,ListNode *list2){
23         //合并list1和list2,返回新的list3的头结点指针
24         if(list1 == NULL){
25             return list2;
26         }
27         else if(list2 == NULL){
28             return list1;
29         }
30         
31         ListNode *list3 = NULL;
32         
33         if(list1->val < list2->val){
34             list3 = list1;
35             list3->next = mergeTwo(list1->next,list2);
36         }
37         else{
38             list3 = list2;
39             list3->next = mergeTwo(list1,list2->next);
40         }
41         return list3;
42     }
43 };

 

posted on 2014-04-05 16:50  Allen Blue  阅读(143)  评论(0编辑  收藏  举报

导航