首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

链表合并排序的实现

链表合并排序是一种常见的排序算法,用于将多个有序链表合并为一个有序链表。下面是链表合并排序的实现步骤:

  1. 定义一个辅助函数merge,用于合并两个有序链表。它的输入是两个链表的头节点,输出是合并后的有序链表的头节点。
  2. 在主函数中,先判断输入的链表是否为空,若为空则直接返回空链表。
  3. 若链表不为空,递归地将链表一分为二,分别对左右两部分链表进行排序。
  4. 最后,调用merge函数将排好序的左右两部分链表合并成一个有序链表,并返回合并后的链表的头节点。

下面是代码示例:

代码语言:txt
复制
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def merge(left, right):
    dummy = ListNode(0)  # 创建一个哑节点作为合并后链表的头节点
    cur = dummy  # 创建一个指针指向当前节点
    while left and right:
        if left.val < right.val:
            cur.next = left
            left = left.next
        else:
            cur.next = right
            right = right.next
        cur = cur.next
    if left:
        cur.next = left
    if right:
        cur.next = right
    return dummy.next

def merge_sort(head):
    if not head or not head.next:
        return head
    
    slow = head
    fast = head.next
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    right = merge_sort(slow.next)  # 递归排序右半部分链表
    slow.next = None  # 断开链表,将链表一分为二
    left = merge_sort(head)  # 递归排序左半部分链表

    return merge(left, right)  # 合并左右两部分链表

# 测试用例
# 创建链表1->4->3->2->5
head = ListNode(1)
head.next = ListNode(4)
head.next.next = ListNode(3)
head.next.next.next = ListNode(2)
head.next.next.next.next = ListNode(5)

# 对链表进行合并排序
sorted_head = merge_sort(head)

# 输出排序后的链表
while sorted_head:
    print(sorted_head.val, end=" ")
    sorted_head = sorted_head.next

链表合并排序的时间复杂度为O(nlogn),其中n是链表的总节点数。该算法适用于多个有序链表的合并排序,例如合并k个有序链表可以通过多次合并两个有序链表的方式实现。对于大规模数据的排序,链表合并排序具有较好的性能表现。

腾讯云提供了云计算相关的产品和服务,可以通过以下链接了解更多信息:

  • 腾讯云云服务器CVM:提供灵活可扩展的云服务器实例,适用于各种计算场景。
  • 腾讯云云数据库MySQL版:提供高性能、高可用的关系型数据库服务,适用于存储和管理数据。
  • 腾讯云CDN:提供全球加速、缓存分发的内容分发网络服务,加速网站和应用的访问速度。
  • 腾讯云人工智能:提供各类人工智能算法和工具,帮助开发者构建智能应用。
  • 腾讯云区块链服务:提供快速构建和部署区块链网络的服务,支持多种区块链框架。

希望以上信息能对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 合并两个排序链表

    题目:输入两个递增排序链表合并这两个链表并使新链表结点仍然是按照递增排序。例如下图中链表1和链表2,则合并之后升序链表链表3所示。...注:链表1和链表2是两个递增排序链表合并这两个链表得到升序链表链表3. 首先分析合并两个链表过程。我们分析从合并两个链表头结点开始。...在两个链表中剩下结点依然是排序,因此合并这两个链表步骤和前面的步骤是一样。我们还是比较两个头结点值。...当我们得到两个链表中值较小头结点并把它连接到已经合并链表之后,两个链表剩余结点依然是排序,因此合并步骤和之前步骤是一样。这就是典型递归过程,可以定义递归函数来完成者以合并过程。...实现代码如下: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2

    1.1K80

    合并k个已排序链表

    因此,时间复杂度是O(nklogk),空间复杂度的话是O(K),因为堆内存放数据量是根据有多少个链表     2,链表1、2合并,然后其结果12和3合并,以此类推,最后是123--k-1和k合并。...这种方法时间复杂度是O(n*(k^2+k-2)/2)=O(nk^2)。     3,是使用归并思路,先两两将小链表合并成更大一点链表,然后将更大链表合并。...,如【0,1,2,3,4,5】六条,0与3先排序,1与4,2与5,      * 然后形成新【0,1,2】,再0与2排序,最后把1也合并了。     ...原因在于,在上面创建了一个新节点,而新节点后面的才是将两个链表合并排序东西         //所以你要把自己创建那个节点给清除掉         return new_list.next;    ...}     /**      * 利用小顶堆思想合并多个已排序链表      *      * @param lists      * @return      */     public static

    32820

    合并两个排序链表

    前言 给定两个递增排序链表,如何将这两个链表合并合并链表依然按照递增排序。本文就跟大家分享一种解决方案,欢迎各位感兴趣开发者阅读本文。...同样,这个问题也可以用双指针思路来实现: p1指针指向链表1头节点 p2指针指向链表2头节点 声明一个变量存储合并链表,比对两个指针指向节点值大小: 如果p1指针指向节点值比p2指向值小...,合并链表节点就取p1节点值,p1指针继续向前走,进行下一轮比对 如果p2指针指向节点值比p1指向值小,合并链表节点就取p2节点值,p2指针继续向前走,进行下一轮比对 当p1节点指向...null时,合并链表节点就为p2所指向链表节点;当p2节点指向null时,合并链表节点就为p1所指向链表节点。...没错,这就是典型递归思路,代码如下: 声明一个函数MergeLinkedList,它接受2个参数:递增排序链表1,递增排序链表2 递归基线条件:链表1为null就返回链表2,链表2为null就返回链表

    84210

    合并两个排序链表

    题意 将两个排序链表合并为一个新排序链表 样例 给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。...思路 这道题很简单,属于链表基本操作。 只需要创建一个新链表与一个指向新链表最后一个节点指针即可。...当 l1 与 l2 均不为空情况下,判断 l1 和 l2大小,把较小值放进新链表最后一个节点,然后将较小值所处链表向后移一位,以判断下一个数。...依次循环,直到 l1 或 l2 中有一方为空时,将为空一方,直接加到新链表后即可。 代码实现 /** * Definition for ListNode....= l2; if (l2 == null) { lastNode.next = l1; } return listNode.next; } } 原题地址 LintCode:合并两个排序链表

    1.5K10

    leetcode链表合并两个排序链表

    序 本文主要记录一下leetcode链表合并两个排序链表 Sort-Linked-List.png 题目 输入两个递增排序链表合并这两个链表并使新链表节点仍然是递增排序。 ​...{ cursor.next = l1; } ​ return newHead.next; } } 这里先创建一个newHead节点来表示合并链表头指针...,然后创建一个cursor,其初始值为newHead;之后同时遍历l1及l2,取最小作为cursor.next,同时该链表前进一个节点,并且cursor跟着前进;最后再将cursor.next指向尚未遍历完链表剩余节点...;之后返回头指针指向节点 小结 合并两个有序链表基本思路就是设置一个cursor以及新链表头指针,然后同时遍历两个链表,取小节点作为cursornext,然后该链表往前进,cursor也跟着往前进...,最后再将cursor.next指向尚未遍历完链表剩余节点 doc he-bing-liang-ge-pai-xu-de-lian-biao-lcof

    64900

    算法-合并两个排序链表

    题目: 输入两个递增排序链表合并着两个链表并使新链表结点仍然是按照递增顺序。例如输入链表1和链表2如下,合并链表3。...解题思路: 首先可以确定是,链表1和链表2本身就是递增,所以合并过程可以从链表1,2头结点开始,先比较1,2头结点中值大小,将小结点(比如为链表1头结点)作为合并链表链表3)...代码实现: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2...个人感觉值得注意地方有下面几个: (1)如果链表1,2为空,要考虑代码鲁棒性。 (2)要考虑链表1,2中某结点数值相等情况,这个在else中包含了。 ? (3)递归调用何时退出?...(4)新链表何时链接?

    845100

    合并两个排序链表

    【题目】 输入两个递增排序链表合并这两个链表并使新链表节点仍然是依照递增排序。...---- 【分析】 合并链表,须要找到头结点,对照两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每一个结点位置,同一时候考虑边界条件,假设两个链表为空。...则肯定无需合并了,就是空链表,假设一个链表为空,还有一个不为空,则返回不为空链表。...,告诉指针要指向地址就要付给它一个结构类型地址 }; //链表初始化 node_t * init() { node_ptr p; p = (node_t *)malloc(sizeof...printf("\n"); node_t *merge_list = merge(list1->node_next, list2->node_next); printf("合并链表顺序为

    43410

    leetcode链表合并两个排序链表

    序 本文主要记录一下leetcode链表合并两个排序链表 题目 输入两个递增排序链表合并这两个链表并使新链表节点仍然是递增排序。...{ cursor.next = l1; } return newHead.next; } } 这里先创建一个newHead节点来表示合并链表头指针...,然后创建一个cursor,其初始值为newHead;之后同时遍历l1及l2,取最小作为cursor.next,同时该链表前进一个节点,并且cursor跟着前进;最后再将cursor.next指向尚未遍历完链表剩余节点...;之后返回头指针指向节点 小结 合并两个有序链表基本思路就是设置一个cursor以及新链表头指针,然后同时遍历两个链表,取小节点作为cursornext,然后该链表往前进,cursor也跟着往前进...,最后再将cursor.next指向尚未遍历完链表剩余节点 doc he-bing-liang-ge-pai-xu-de-lian-biao-lcof

    46620

    合并两个排序链表

    1 问题 关于链表合并,常见类型有两种: 直接合并,没有什么规则: 将多个链表头尾相连合并成一个链表 有序链表合并成有序链表: 两个有序链表合并成一个有序链表。...这里我们将要解决问题是有序列表合并,在上课时候我们学习了如何直接合并两个单链表,那么如果在合并同时还要注意顺序问题的话该如何解决呢?本篇周博客将讨论此问题。...2 方法 (1)判断空链表情况,只要有一个链表为空,那答案必定就是另一个链表了,就算另一个链表也为空。 (2)新建一个空表头后面连接两个链表排序节点,两个指针分别指向两链表头。...(3)遍历两个链表都不为空情况,取较小值添加在新链表后面,每次只把被添加链表指针后移。...,直接连在后面 if pHead1: cur.next = pHead1 else: cur.next = pHead2 #返回值去掉表头 # return head.next 3 结语 我们针对排序链表合并问题

    10210

    图解「合并 K 个排序链表

    题目描述 合并 k 个排序链表,返回合并排序链表。请分析和描述算法复杂度。...个排序链表,那么这 ? 个排序链表头结点中 val 最小结点就是合并以后链表中最小结点; 2、最小结点所在链表头结点就要更新了,更新成最小结点下一个结点(如果有的话),此时还是这 ?...个排序链表头结点中拿出 val 最小结点“穿针引线”成新链表,这个链表就是题目要求合并排序链表”。 “局部最优,全局就最优”,这不就是贪心算法思想吗。...LeetCode 第 23 题:合并K个排序链表-3 代码实现 class Solution { public ListNode mergeKLists(ListNode[] lists) {...空间复杂度:O(1),合并两个排序链表需要“穿针引线”指针数是常数个

    1.4K00
    领券