LeetCode题目:23. Merge k Sorted Lists

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MyCodecOdecoDecodE/article/details/78090516

LeetCode题目:23. Merge k Sorted Lists

原题链接:https://leetcode.com/problems/merge-k-sorted-lists/description/

解题思路:

将k个链表合并,看成依次将其中两个链表合并,即可简化题目。

核心思想:

不停取两个链表合并,再放回去,直到剩下唯一一个链表。

代码细节:

  1. 在链表合并的时候,新建一个结点当做头结点前的一个节点,这样头结点就不用特殊进行操作了。

坑点:

  1. 输入为空。

代码:

// 将两个有序链表合成一个 
ListNode* TwoListstoOne(ListNode *h1, ListNode *h2) {
    ListNode *newHeadPre = new ListNode(0);  // 创立头结点的前一个节点 
    ListNode *newTemp = newHeadPre;          // 用于遍历的节点

    // 将小的值加入新链表 
    while (h1 != NULL || h2 != NULL) {
        if (h1 == NULL || (h2 != NULL && h1->val > h2->val)) {
            newTemp->next = new ListNode(h2->val);
            h2 = h2->next;
        }
        else {
            newTemp->next = new ListNode(h1->val);
            h1 = h1->next; 
        }
        newTemp = newTemp->next;
    } 

    return newHeadPre->next;
}

ListNode* mergeKLists(vector<ListNode*>& lists) {
    // 输入为空 
    if (lists.empty())  return NULL;

    while (lists.size() > 1) {
        // 将前两个链表合并成新链表 
        lists.push_back(TwoListstoOne(lists[0], lists[1]));

        // 删除旧链表
        lists.erase(lists.begin(), lists.begin() + 2); 
    } 

    return lists[0];
}

猜你喜欢

转载自blog.csdn.net/MyCodecOdecoDecodE/article/details/78090516