python解决合并排序列表问题

这里主要是使用分治算法思想解决对于给定的n个有序的链表,进行合并操作之后还是一个有序的链表。如下例子:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

如果想要合并n个有序的链表,首先需要直到合并两个有序链表的方法,如果定义一个新的节点,然后将两个链表中的节点按照大小顺序逐个加入即可,python实现的代码如下:

复制代码
    def merge2links(self, head1, head2):
        point=mergedhead=ListNode(None)
        while head1 and head2:
            if head1.val <= head2.val:
                point.next = head1
                head1 = head1.next
            else:
                point.next = head2
                head2 = head2.next
            point = point.next
        if not head1:
            point.next=head2
        else:
            point.next=head1
        return mergedhead.next

以第二个例子为例展示两个链表合并的过程:

合并前两个链表的初始状态

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

在合并的最后就是此时的head1是空,需要结束while循环并将point的下一个位置指向head2即可,将mergedhead.next返回,即为合并之后的链表的头结点了。

在直到两个有序链表的合并之后,需要考虑如何n各有序链表,需要利用n个头指针同时进行对比操作这很繁琐易出错,所以我们可以考虑将n个链表两两合并,最终合并成为一个链表。以8个链表合并为例如下:

添加图片注释,不超过 140 字(可选)

python实现的完整代码如下:

复制代码
class Solution(object):
    def mergenlinks(self, links):
        length=len(links)
        iterval=1
        while length>iterval:
            for i in range(0,length-iterval,iterval*2):
                links[i]=self.merge2links(links[i],links[i+iterval])
            iterval*=2
        return links[0] if length>0 else None
    def merge2links(self, head1, head2):
        point=mergedhead=ListNode(None)
        while head1 and head2:
            if head1.val <= head2.val:
                point.next = head1
                head1 = head1.next
            else:
                point.next = head2
                head2 = head2.next
            point = point.next
        if not head1:
            point.next=head2
        else:
            point.next=head1
        return mergedhead.next
相关推荐
长河3 分钟前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
程序员清风8 分钟前
Python 数据分析环境搭建:从 Jupyter 到 pandas
python·jupyter·数据分析
月光船幽幽21 分钟前
加性偏移外推提升参数识别可靠性
python·算法
SHARK_pssm30 分钟前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
凯哥Java31 分钟前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化
Ivanqhz1 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
BD_Marathon1 小时前
消息对象中字段的说明
java·前端·python
Ai-_Man1 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
Java后端的Ai之路1 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
沫璃染墨1 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构