一、写在前面
之前写过的Leetcode笔记:点击查看
今天给大家分享的是LeetCode 023: 合并K个排序链表,为面试而生,期待你的加入。
二、今日题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
三、 分析
这个题目,相当于昨天做的合并两个排序链表进阶版,思路可以基于昨天的题。
首先,解题分为两步:
1、将链表两两分组
2、将两个有序链表合并成一个
(明天补充完整思路)
四、解题
- 方法一:
# -*- coding: utf-8 -*-
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
if not lists:
return
n = len(lists) # 计算需合并链表个数
return self.merge(lists, 0, n-1)
def merge(self,lists, left, right): # 折半合并,将合并多个链表问题,转换成合并两个链表问题
if left == right:
return lists[left]
mid = left + (right - left) // 2
l1 = self.merge(lists, left, mid)
l2 = self.merge(lists, mid+1, right)
return self.mergeTwoLists(l1, l2)
# 合并两个有序链表(递归法)
def mergeTwoLists(self,l1, l2):
if not l1:return l2
if not l2:return l1
if l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
- 运行结果: