LeetCode 合并K个排序链表 [***标记****]

合并K个排序链表

题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解题方法

(错误方法)方法一:

超时了…

 # 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:
        if not lists: return None
        res = ListNode(0)
        head=res
        while True:
            list_val = []
            for listnode in lists:
                if listnode: list_val.append(listnode.val)
                else: list_val.append(None)
            if None in list_val:
                l_copy = list_val.copy()
                while None in l_copy: l_copy.remove(None)
                #print("l_copy:", l_copy)
                if not l_copy : break
                min_index = list_val.index(min(l_copy))
            else:
                min_index = list_val.index(min(list_val))

            #print(min_index, list_val)

            res.next = lists[min_index]
            if lists[min_index]: lists[min_index] = lists[min_index].next
            res = res.next
        
        return head.next            

在这里插入图片描述

(错误方法修正版)方法二:

    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        if not lists: return None
        res = ListNode(0)
        head=res
        while True:
            list_val = []
            list_no_none = []
            for listnode in lists:
                if listnode: 
                    list_val.append(listnode.val)
                    list_no_none.append(listnode.val)
                else: list_val.append(None)
            if None in list_val:
                if not list_no_none : break
                min_index = list_val.index(min(list_no_none))
            else:
                min_index = list_val.index(min(list_val))

            #print(min_index, list_val)

            res.next = lists[min_index]
            if lists[min_index]: lists[min_index] = lists[min_index].next
            res = res.next        
        return head.next   

在这里插入图片描述

(正确方法) 方法三(修正前面的算法):

class Solution:
    def get_min_temp(self,lists,val_list):
    
        if val_list==[]:
            return lists,None,val_list
        min_val = min(val_list)
        i = val_list.index(min_val)
        node = lists[i]
        if lists[i].next:
            val_list[i]=lists[i].next.val
            lists[i] = lists[i].next
            return lists,node,val_list
        else:
            val_list = val_list[:i]+val_list[i+1:]
            lists = lists[:i]+lists[i+1:]
            return lists,node,val_list
        
    def mergeKLists(self, lists):

        for i in range(len(lists)):
            try:
                lists.remove(None)
            except:
                pass 
        if lists==[]:
            return None
        val_list = []
        for i in range(len(lists)):
            val_list.append(lists[i].val) 
        head = ListNode(0)
        temp=head
        Flag = True
        while Flag:
                lists,node,val_list = self.get_min_temp(lists,val_list)
                if node:
                    temp.next=node
                    temp = temp.next
                else:
                    Flag = False
        return head.next

在这里插入图片描述

(正确方法——分治法)方法四:

多路归并排序
前面有有一道两个有序ListNode合并的编程题,基于这个,考虑将lists中的listnode先两两合并,对合并后新的lists,再次进行两两合并,循环进行,知道lists的长度为1为止。

# 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:
        if not lists : return 
        if len(lists)==1: return lists[0]
        while len(lists)>1:
            i , j = 0 , len(lists)-1
            while(i<j):
                lists[i] = self.mergeTwoLists(lists[i], lists[j])
                i+=1
                j-=1
                if i==j: break
            lists = lists[0:len(lists)/2] if len(lists)%2==0 else lists[0:len(lists)//2+1]
        return lists[0]
   
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l2: return l1
        if not l1: return l2
        if l1.val<l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值