【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 };

 

你可能感兴趣的:(LeetCode)