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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 21. 合并两个有序链表 23. 合并K个升序链表【每日一题】 -> 正文阅读

[数据结构与算法]21. 合并两个有序链表 23. 合并K个升序链表【每日一题】

21. 合并两个有序链表

思路

? ? ? ? ? 思路比较简单常规思路,和合并有序数组一样,分别去一个出来,然后比大小,结果加入小的一个,小的对应链表一个取新的出来,继续比较,直到其中一个比完了

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1==None:
            return list2
        if list2==None:
            return list1

        # 循环
        res = ListNode(None)
        node = res
        while list1!=None and list2!=None:
            if list1.val<list2.val:
                node.next = list1
                list1 = list1.next
            else:
                node.next = list2
                list2=list2.next
            node = node.next
        if list1!= None:
            node.next = list1
        else:
            node.next = list2
        
        return res.next

为了更好的过渡到合并K个的,我们介绍一下递归形式的;你想想,我们有一个函数可以合并两个链表,那么我只需要比较最开始两个链表的头大小似乎就行了

  • 如果第一个链表头小,那么我直接调用函数合并第一个链表后面的和第二个链表得到一个有序列表,且这个有序列表的最小值肯定比第一个链表头大(这不是废话吗,原来的链表都是有序的,那这样比较得到的头肯定是最小的)
  • 如果第二个链表头小,那么我直接调用函数合并第二个链表后面的和第一个链表得到一个有序列表

在这儿,我们假设这个函数能做到这个合并两个有序链表,那么你会发现比较完第一个后,又变成,两个有序链表的合并,随意递归是有搞头的,注意写好递归终止条件

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1==None:
            return list2
        if list2==None:
            return list1
        
       # 递归
        if list1.val<list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2

23. 合并K个升序链表

? ? ? ? ? 思路也还好,就是刚才递归的想法,我们假设已经有一个函数可以实现合并K个升序链表,是吧,那么我现在把k个链表从中间分成两部分,然后分别调用这个函数,是不是就把前面的一半合并好了,后面的一半也合并好了,最后调用合并两个有序的代码把前后两部分合并。递归出口是那些那

  1. 待合并的是空,返回空
  2. 待合并的是1个,返回他自己
  3. 待合并的是两个,调合并两个的,返回
  4. 待合并的多个,那就分前后部分,然后前后都都调用这个合并k个的函数,最后调用合并两个的代码把前后两部分合并。
# 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]:
        n = len(lists)
        if n==0:
            return None
        elif n== 1:
            return lists[0]
        elif n==2:
            return  self.mergeTwoLists(lists[0],lists[1])
        
        mid = n//2
        l_list = []
        for i in range(mid):
            l_list.append(lists[i])

        r_list=[]
        for i in range(mid,n):
            r_list.append(lists[i])
            
        return self.mergeTwoLists(self.mergeKLists(l_list),self.mergeKLists(r_list))

    # 先把合并两个的抄过来
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1==None:
            return list2
        if list2==None:
            return list1
        
        if list1.val<list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:49: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 11:50:55-

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