Leetcode-23.合并k个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路
采用分治算法,子问题同两个有序链表问题
先两个和,剩余k/2个链表再两两合并,直到只有一条链表
# 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
"""
n=len(lists)
step=1
while step<n:
for i in range(0,n-step,step*2):
lists[i]=self.mergetwo(lists[i],lists[i+step])
step=step*2
return lists[0] if lists else None
def mergetwo(self,l1,l2):
prep=ListNode(-1)
head=prep
while l1 and l2:
if l1.val<=l2.val:
prep.next=l1
l1=l1.next
else:
prep.next=l2
l2=l2.next
prep=prep.next
if l1:
prep.next=l1
if l2:
prep.next=l2
return head.next
执行用时 :96 ms, 在所有 python 提交中击败了88.19%的用户
内存消耗 :17.2 MB, 在所有 python 提交中击败了58.07%的用户
小总结
该题目用了分治的思想,其合并的思路,是我这一题最大的收获