23. Merge k Sorted Lists

https://leetcode.com/problems/merge-k-sorted-lists/description/
题意:合并k(不定)个有序链表
思路1:设计了一个自认为非常巧的暴力法(其实就是solution的第二种方法),思路和两个表合并差不多,每次遍历k个表找最小节点插入新链,找到的第i个链指针前移一位。直到所有链遍历完,还用了一个小技巧,当处理到只剩一条链时,直接加入新链。
让并卵,超时了

class Solution:
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        head = ListNode(0)
        work = head
        available = []  #用于表示每条链是否空的状态表
        for i in range(len(lists)):
            if lists[i]:
                available.append(True)
            else:
                available.append(False)
        while sum(available) > 1:  #注意布尔值列表也可以用sum求和
            min = sys.maxsize  #最小值,初始为py的最大数
            index = -1  #最小值所在链,初始-1
            for i in range(len(lists)):
                if not lists[i]:  #遇到空链则跳过
                    available[i] = False
                    continue
                if lists[i].val < min:
                    min = lists[i].val
                    index = i
            if index != -1:    #若能找到最小值
                work.next = lists[index]
                work = lists[index]
                lists[index] = lists[index].next
        #对最后一条链表特殊处理
        for i, a in enumerate(available):  #找到非空链的下标i
            if a:  
                work.next = lists[i]
        return head.next

思路2:soluition第一种的暴力法,真心暴力,直接遍历每条链的每个节点,把所有值记录下来。然后排序,根据排序后的序列构建出一条新链来。。。。

class Solution():
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        nodes = []
        head = point = ListNode(0)
        for l in lists:
            while l:
                nodes.append(l.val)
                l = l.next
        nodes.sort()  #排序
        for x in nodes:
            point.next = ListNode(x)
            point = point.next
        return head.next
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值