题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一(暴力法)
- 思路
将链表中的值逐一取出,排序,再放入一个新链表内 - 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
nums=[]
for ilist in lists:
while ilist!=None:
nums.append(ilist.val)
ilist=ilist.next
ihead=ListNode(0)
node=ihead
nums.sort()
for num in nums:
node.next=ListNode(num)
node=node.next
return ihead.next
- 结果
解法二(分治法)
- 思路
递归把lists中的链表折半分组处理:
(1)若组中只剩1个链表,返回它本身
(2)若组中数组多于2个,把左半部分的处理结果存入lists[l],右半部分的存入lists[r]
再返回mergeTwoLists(lists[l],lists[r])——>22题 - 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
lens=len(lists)
if lens==0:
return None
return self.imerge(lists,0,lens-1)
def imerge(self,lists,l,r):
if r==l:
return lists[l]
if r-l!=1:
mid=(r+l)//2
lists[l]=self.imerge(lists,l,mid)
lists[r]=self.imerge(lists,mid+1,r)
return self.mergeTwoLists(lists[l],lists[r])
def mergeTwoLists(self, l1, l2):
if l1 and l2:
if l1.val > l2.val:
l1, l2 = l2, l1
l1.next = self.mergeTwoLists(l1.next, l2)
return l1 or l2
- 结果