【leetcode 23】C++链表操作1:Merge k Sorted Lists

题目:

将K个有序的链表进行归并排序,例子:
这里写图片描述

解题思路:

方法一:
一个比较慢的方法,就是每次遍历lists中的每一个头节点,找出最小值加入到结果链表中,并将该元素从lists中“删除“,当lists中没有元素的时候,归并排序完成。
实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* result = new ListNode(0);
        ListNode* q = result;
        int count = 0;

        while(count < lists.size()) {
            int location = 0;
            int imin = INT_MAX;
            for( int i = 0; i < lists.size(); i++) {
                if(lists[i] == NULL) {
                    lists[i] = new ListNode(INT_MAX);
                    count++;
                    if(count == lists.size()){
                        return result->next;
                    }
                    continue;
                }
                if(lists[i]->val < imin){
                    imin = lists[i]->val;
                    location = i;
                }
            }

            q -> next = lists[location];
            q = q->next;
            lists[location] = lists[location]->next;
        }
        return result->next;
    }
};

方法二:
采用归并排序的思想,每次选择两个链表进行归并排序,一次排序之后,待归并排序的链表的个数变为原来的1/2,最后还有一个链表的时候,排序结束,得到的就是排好序的链表。
实现:

这里写代码片

猜你喜欢

转载自blog.csdn.net/u013108511/article/details/80428482