21. 合并两个有序链表
难度简单1616
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == nullptr){
return l2;
}else if(l2 == nullptr){
return l1;
}
if(l1->val < l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}else{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
23. 合并K个升序链表
难度困难1219
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
/**
* 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* mergeTwoLists(ListNode* a, ListNode* b){
if((!a) || (!b)) return a ? a : b;
ListNode* nhead = new ListNode(-1);
ListNode* pre = nhead;
ListNode* ap = a, *bp = b;
while(ap && bp){
if(ap->val < bp->val){
pre->next = ap;
ap = ap->next;
}else{
pre->next = bp;
bp = bp->next;
}
pre = pre->next;
}
pre->next = ap == nullptr ? bp : ap;
return nhead->next;
}
ListNode* merge(vector<ListNode*>& lists, int l, int r){
//只有一个元素的情况
if(l == r) return lists[l];
if(l > r) return nullptr;
int mid = l + r >> 1;
return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
return merge(lists, 0, lists.size() - 1);
}
};
148. 排序链表
难度中等1058
给你链表的头结点head
,请将其按 升序 排列并返回 排序后的链表 。
进阶:你可以在
O(n log n)
时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目在范围
[0, 5 * 10]
内 -10 <= Node.val <= 10
/**
* 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* sortList(ListNode* head) {
return sortList(head, nullptr);
}
ListNode* sortList(ListNode* head, ListNode* tail){
if(head == nullptr){
return head;
}
if(head->next == tail){
head->next = nullptr;
return head;
}
//寻找中点
ListNode* slow = head, *fast = head;
while(fast != tail){
slow = slow->next;
fast = fast->next;
if(fast != tail){
fast = fast->next;
}
}
return merge(sortList(head, slow), sortList(slow, tail));
}
ListNode* merge(ListNode* l1, ListNode* l2){
if(!l1) return l2;
if(!l2) return l1;
ListNode* p1 = l1, *p2 = l2;
ListNode* dum = new ListNode(-1);
ListNode* p = dum;
while(p1 && p2){
if(p1->val <= p2->val){
p->next = p1;
p1 = p1->next;
}else{
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
p->next = p1 == nullptr ? p2 : p1;
return dum->next;
}
};