合并 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) {

leetcode 23. 合并K个排序链表(二分查找+动态合并)

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) {

leetcode 23. 合并K个排序链表(二分查找+动态合并)

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"""

leetcode 23. 合并K个排序链表(二分查找+动态合并)

例题来自力扣网https://leetcode-cn.com/

链表列中有k个链表,两两合并到一起进实际进行k-1次合并。通过二分查找链表时间复杂度在o(logn),进行一次合并开销为o(min(m,n)),m,n为两合并链表的链表长度

完整程序实现可前往公众号回复“23”免费获取

leetcode 23. 合并K个排序链表(二分查找+动态合并)

相关文章: