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