1 题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6]
2 解析注意,最外层是列表,第二层是链表 如上面的[1,4,5]是链表1->4->5 (1)方法一 暴力求解,使用数组来存储所有元素,再对数组排序,最后用有序数组生成链表 (2)方法二 使用小顶堆,采用python包的heapq
(3)方法三 分而治之,使用两个链表的合并为有序的方法
3 python实现(1)方法一
# 暴力求解,使用数组来存储所有元素,再对数组排序,最后用有序数组生成链表
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
temp = []
for i in lists:
while i:
temp.append(i.val)
i =i.next
temp.sort()
p = dummy = ListNode(0)
for j in temp:
p.next = ListNode(j)
p = p.next
return dummy.next
(2)方法二
# 使用小顶堆
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
import heapq
head = []
for i in lists:
while i:
heapq.heappush(head,i.val)
i = i.next
p = dummy = ListNode(0)
while head:
val = heapq.heappop(head)
p.next = ListNode(val)
p = p.next
return dummy.next
(3)方法三
# 分而治之,使用两个链表的合并为有序的方法
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
if len(lists) ==0:
return ListNode().next
res = lists[0]
for i in range(1,len(lists)):
res = self.mergeTwoList(res,lists[i])
return res
def mergeTwoList(self, a:ListNode,b:ListNode) ->ListNode:
if not a:
return b
if not b:
return a
p,q = a,b
tail = head = ListNode(0)
while p and q:
if p.val
关注
打赏
热门博文
- 【文献汇总】2019-2021最新应用深度学习到OFDM通信系统中的论文汇总(实时更新)
- 【金融量化】电话口试-智力题
- 【数据挖掘】2022年2023届秋招爱玩特智能量化研究员岗 笔试题
- 【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
- 【Leetcode刷题Python】50. Pow(x, n)
- 【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
- 【Leetcode刷题Python】73. 矩阵置零
- 【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
- 【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
- 【数据挖掘】2022年2023届秋招Kanaries雾角科技算法岗 笔试题