题目描述:
题号:23
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
解题思路:
思路一:逐个有序合并
利用 21 题:合并两个有序链表中的函数,将 k 个链表逐个有序合并并最终合并为一个。
时间复杂度:O(N * k)
空间复杂度:O(1)
C++
// C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* ans = nullptr;
for (int i = 0; i < lists.size(); i++) {
ans = mergeTwoLists (ans, lists[i]);
}
return ans;
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == nullptr) {
return list2;
}
if(list2 == nullptr) {
return list1;
}
ListNode *dummyHead = new ListNode(-999);
ListNode *cur = dummyHead;
while(list1 != nullptr && list2 != nullptr) {
if(list1->val > list2->val) {
cur->next = list2;
list2 = list2->next;
} else {
cur->next = list1;
list1 = list1->next;
}
cur = cur->next;
}
// 将其余必然升序的项附加在后面
cur->next = list1 == nullptr ? list2 : list1;
ListNode *newHead = dummyHead->next;
// 防止内存泄露
delete dummyHead;
return newHead;
}
};
go
// go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
var ans *ListNode
ans = nil
for _, list := range lists {
ans = mergeTwoLists(ans, list)
}
return ans
}
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
if list1 == nil {
return list2
}
if list2 == nil {
return list1
}
dummyHead := &ListNode{}
cur := dummyHead
for list1 != nil && list2 != nil {
if list1.Val > list2.Val {
cur.Next = list2
list2 = list2.Next
} else {
cur.Next = list1
list1 = list1.Next
}
cur = cur.Next
}
if list1 != nil {
cur.Next = list1
} else {
cur.Next = list2
}
return dummyHead.Next
}