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 <= 100l1和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.length0 <= k <= 10^40 <= lists[i].length <= 500-10^4 <= lists[i][j] <= 10^4lists[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;}};
