版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MyCodecOdecoDecodE/article/details/78090516
LeetCode题目:23. Merge k Sorted Lists
原题链接:https://leetcode.com/problems/merge-k-sorted-lists/description/
解题思路:
将k个链表合并,看成依次将其中两个链表合并,即可简化题目。
核心思想:
不停取两个链表合并,再放回去,直到剩下唯一一个链表。
代码细节:
- 在链表合并的时候,新建一个结点当做头结点前的一个节点,这样头结点就不用特殊进行操作了。
坑点:
- 输入为空。
代码:
// 将两个有序链表合成一个
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];
}