【Leetcode】23.合并k个排序链表C++(队列归并法)

在这里插入图片描述
在这里插入图片描述

#include "iostream"

#include "vector"

#include "queue"

using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution
{
public:
    void print(ListNode *head)
    {
        ListNode *p = head;
        while (p != NULL)
        {
            cout << p->val << " ";
            p = p->next;
        }
        cout << endl;
    }

    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
    {
        if (l1 == NULL)
        {
            return l2;
        }
        else if (l2 == NULL)
        {
            return l1;
        }

        ListNode *p1, *p2, *s;
        if (l1->val <= l2->val)
        {
            p1 = l1;
            p2 = l2;
        }
        else
        {
            p1 = l2;
            p2 = l1;
            l1 = l2;
        }
        while (p2 != NULL)
        {
            if (p1->next == NULL)
            {
                p1->next = p2;
                return l1;
            }
            if (p1->next->val < p2->val)
            {
                p1 = p1->next;
            }
            else
            {
                s = p2->next;
                p2->next = p1->next;
                p1->next = p2;
                p2 = s;
            }
        }

        return l1;
    }

    ListNode *mergeKLists(vector<ListNode *> &lists)
    {
        int size = lists.size();
        if (size == 0)
        {
            return NULL;
        }
        if (size == 1)
        {
            return lists[0];
        }

        //将vector转为队列,转换成归并排序
        queue<ListNode *> waiting(deque<ListNode *>(lists.begin(), lists.end()));

        //如果队列元素数目大于1,则取出两个进行合并,放到队列尾部
        while (waiting.size() > 1)
        {
            // 注意pop无返回值
            ListNode *l1 = waiting.front();
            waiting.pop(); // 弹出l1

            ListNode *l2 = waiting.front();
            waiting.pop(); // 弹出l2

            waiting.push(mergeTwoLists(l1, l2));
        }

        return waiting.front();
    }
};

int main(int argc, char const *argv[])
{
    ListNode *p;
    vector<ListNode *> lists;

    int k, x;

    Solution so;

    cout << "K=";
    cin >> k;

    for (int i = 0; i < k; i++)
    {
        cin >> x;
        p = new ListNode(x);
        lists.push_back(p);
        while (true)
        {
            cin >> x;
            p->next = new ListNode(x);
            p = p->next;
            if (cin.get() == '\n')
                break;
        }
    }

    ListNode *head = so.mergeKLists(lists);
    so.print(head);

    return 0;
}
发布了103 篇原创文章 · 获赞 128 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104088147