IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python--leetcode 双指针技巧秒杀七道链表题目 -> 正文阅读

[数据结构与算法]python--leetcode 双指针技巧秒杀七道链表题目

23. 合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

使用小跟堆(https://labuladong.gitee.io/algo/2/22/64/)
以及python 标准库 heapq (https://www.jianshu.com/p/801318c77ab5)

nums = [2, 3, 5, 1, 54, 23, 132]
heap = []
for num in nums:
    heapq.heappush(heap, num)  # 加入堆

print(heap[0])  # 如果只是想获取最小值而不是弹出,使用heap[0]
print([heapq.heappop(heap) for _ in range(len(nums))])  # 注意这里是len(nums) 而不是heap,因为根据总共个数进行heappop排序
# out: [1, 2, 3, 5, 23, 54, 132]

另:链表题目

        res = ListNode(-1)
        head = res #记录头节点
        for xxx
            temp = ListNode()
            res.next = temp
            res = res.next
        return head.next

进阶:只使用k个节点保存小根堆
python 重载运算符定义Listnode节点的大小比较
小根堆保存k个节点,在节点弹出后,heappush进这个节点在list中的下一个节点

# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

        def __lt__(l1, l2):
            return a.val < b.val
        ListNode.__lt__ = __lt__


这时,heapq就可以调用重载的比较符号进行比较

        minHeap = []
        for x in lists:
            if x:
                heapq.heappush(minHeap, (x))

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        def __lt__(l1,l2):
            return l1.val < l2.val
        ListNode.__lt__ = __lt__
        minheap=[]
        for l in lists:
            if l:
                heapq.heappush(minheap, l)
        res = ListNode(-1)
        pre = res
        while(len(minheap)!=0):
            store = heapq.heappop(minheap)
            pre.next = store
            pre = pre.next
            if(store.next):
                heapq.heappush(minheap, store.next)
        return res.next

2 。删除倒数第k个节点,这种不能预知长度的,可以用两个节点一起移动的方法
链表环入口问题
慢: L+R
快: L+R+circle
2k - k = circle -> k = circle

快指针离环入口: circle - R
慢走过了k步 L + R = k
求 L = k - R = circle - R
所以快指针保留不动,继续完成剩下的圈就走了circle - R步 即L
所以慢指针移动到head,两个指针再次相遇的点即入口

判断两个链表相交的节点
a遍历lista再遍历listb
b遍历listb再遍历lista
找到第一个相等节点

一般使用快慢指针,快指针需要调用.next.next,所以循环条件需要是

while(quick and quick.next)

避免Nonetype have no next 的问题

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:19:45  更:2022-04-01 00:23:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:42:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码