题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例

方法1-stupid
- 遍历所有链表将节点值加入列表中,
- 对列表进行升序
- 根据列表创建新的链表
代码实现
| |
| def mergeKLists_v0(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]: |
| |
| dummy = ListNode(-1) |
| p = dummy |
| nums = [] |
| for l in lists: |
| while l: |
| nums.append(l.val) |
| l = l.next |
| for i in sorted(nums): |
| p.next = ListNode(nums[i]) |
| p = p.next |
| |
| return dummy.next |
方法2-优先队列
算法步骤
- 创建虚拟头节点(dummy)
- 创建优先队列,将所有链表的头节点加入优先队列中
- 若队列不为空:
- 取出队列中节点值最小的节点node,根据节点值创建新节点,并链接到头节点后
- 移动节点p指向当前节点node,node指向下一个节点
- 将node的下一个节点加入优先队列中。
python使用优先队列
| |
| from queue import PriorityQueue |
| |
| q = PriorityQueue() |
| |
| q.put((node.val,idx,node)) |
| |
| node.val,idx,node = q.get() |
代码实现
| |
| def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]: |
| |
| head = p = ListNode(-1) |
| q = PriorityQueue() |
| |
| for i,node in enumerate(lists): |
| if node: |
| q.put((node.val,i,node)) |
| |
| while not q.empty(): |
| val,idx,node = q.get() |
| p.next = ListNode(val) |
| p = p.next |
| node = node.next |
| |
| if node: |
| q.put((node.val,idx,node)) |
| |
| |
| return head.next |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异