合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
题解:
1.k个链表
2.这k个链表本身是有序的
3.合并这k个链表
4.合并后的链表也应当是有序的
示例:
输入:
[1->4->5,
1->3->4,
2->6]
输出: 1->1->2->3->4->4->5->6
解题思路:二分查找+动态合并
题目给出了k个链表,一次完成多个链表的合并不现实且链表的个数是不确定的,我们可以计算链表的个数,再通过两两合并的思想
-
从查找的第一个链表开始和第二个链表合并产生一个新链表
-
这样不断的从链表列里取出链表和这个链表合并,合并完整个链表列
-
二分查找可以帮我们取出链表列里所有链表
-
两链表合并的方式要保证有序
-
即两链表从头开始挨个比较,把值小的结点添加到结果链表里
-
注意如果一个链表先到达链表尾,则直接把另一个链表链到尾部
C/C++题解:
/*** Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* }; */
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
Java题解:
/** * Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
Python题解:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
""":type lists: List[ListNode]:rtype: ListNode"""
例题来自力扣网https://leetcode-cn.com/
链表列中有k个链表,两两合并到一起进实际进行k-1次合并。通过二分查找链表时间复杂度在o(logn),进行一次合并开销为o(min(m,n)),m,n为两合并链表的链表长度
完整程序实现可前往公众号回复“23”免费获取