【LeetCode 23.】Merge k Sorted Lists

题目大意:

给出 n 个有序链表,合并为1个有序链表。

思路1:

优先队列。每次取n个链表的最小值,然后把取出节点的next节点加入队列。

思路2:

每次合并2个。时间复杂度不太会计算。

链表除了操作麻烦还是和数组不一样的,有自己的特性。这道题感觉出来了。

代码:

代码1:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    struct cmp {
        bool operator() (ListNode* a, ListNode* b){
            return a->val > b->val;
        }
    };
    
    
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode ans(-1);
        ListNode* cur = &ans;
       
        priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
        
        for (ListNode* list : lists) {
            if (list) pq.push(list);
        }
        
        while(!pq.empty()) {
            cur->next = pq.top();
            pq.pop();
            cur = cur->next;
            //cout << "----\n";
            if (cur->next) pq.push(cur->next);
        }
        return ans.next;
    }
};

代码2:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    ListNode* merge2Lists(ListNode* list1, ListNode* list2) {
        ListNode ans(-1);
        ListNode* cur = &ans;
        while(list1 && list2) {
            if (list1->val < list2->val) {
                cur->next = list1;
                list1 = list1->next;
            }else {
                cur->next = list2;
                list2 = list2->next;
            }
            cur = cur->next;
        }
        cur->next = list1 ? list1 : list2;
        return ans.next;
    }
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int ed = lists.size();
        while(ed > 1) {
            for (int i=0; i<ed/2; ++i) {
                lists[i] = merge2Lists(lists[i], lists[ed-1-i]);
            }
            ed = ed - ed/2;
        }
        return lists.empty() ? NULL : lists[0];
    }
};

经历了暴躁的一周。今天终于好点了。
都可以的。尽力了就好。是不是走弯路不是你能决定的了。
首先,至少做到让自己觉得,我可以。

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/93854412