#能不动脑子咱就不动,暴力解法
#将链表元素放置数组中
#进行排序
#生成新链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
res = [] #空列表,放置数组
ans = ListNode() #设置虚拟节点
ans.next = None
for link in lists: #将每个数字加入到ListNode
while link:
res.append(link.val)
link = link.next #注意,此对象为ListNode,需要使用link.next进行遍历
res = sorted(res, reverse = True) # 排序,reverse代表从小到大排序
if len(res) > 0:
ans.val = res[0] #设置头节点
for i in range(1, len(res)):
tmp = ListNode() #临时节点
tmp.val = res[i] #赋值
tmp.next = ans #链接
ans = tmp #ans指向tmp,重新来过
return ans #返回ans链表
else:
return None
#俩俩合并,21 pro max
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode: # 合并k项,利用函数+for循环
if not lists: return None
res = None #设置初始结果为空
for listi in lists: #逐个遍历 两两合并
res = self.mergeTwoLists(res, listi)
return res
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: #上一题的解法
dummy = ListNode(0) #构造虚节点
move = dummy #设置移动节点等于虚节点
while l1 and l2: #都不空时
if l1.val < l2.val:
move.next = l1 #移动节点指向数小的链表
l1 = l1.next
else:
move.next = l2
l2 = l2.next
move = move.next
move.next = l1 if l1 else l2 #连接后续非空链表
return dummy.next #虚节点仍在开头
#堆:利用堆的数据结构,可以极大地简化代码
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
import heapq #调用堆
minHeap = [] #最小堆
for listi in lists:
while listi:
heapq.heappush(minHeap, listi.val) #把listi中的数据逐个加到堆中
listi = listi.next
dummy = ListNode(0) #构造虚节点
p = dummy
while minHeap:
p.next = ListNode(heapq.heappop(minHeap)) #依次弹出最小堆的数据
p = p.next
return dummy.next