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

链表的Mergesort的Python实现不起作用

链表的Mergesort是一种常用的排序算法,用于对链表进行排序。下面是链表的Mergesort的Python实现:

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

def mergeSort(head):
    if not head or not head.next:
        return head
    
    # 找到链表的中点
    slow, fast = head, head.next
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    # 将链表分为两部分
    mid = slow.next
    slow.next = None
    
    # 递归地对两部分链表进行排序
    left = mergeSort(head)
    right = mergeSort(mid)
    
    # 合并两个有序链表
    dummy = ListNode(0)
    curr = dummy
    while left and right:
        if left.val < right.val:
            curr.next = left
            left = left.next
        else:
            curr.next = right
            right = right.next
        curr = curr.next
    
    curr.next = left if left else right
    
    return dummy.next

这段代码实现了链表的Mergesort算法。具体步骤如下:

  1. 定义一个ListNode类,表示链表的节点。
  2. 定义mergeSort函数,用于对链表进行排序。如果链表为空或只有一个节点,直接返回链表。
  3. 使用快慢指针找到链表的中点,将链表分为两部分。
  4. 递归地对两部分链表进行排序。
  5. 合并两个有序链表,创建一个虚拟头节点dummy和一个当前节点curr
  6. 比较左右两个链表的节点值,将较小的节点连接到curr的后面。
  7. 更新curr和被选中节点的指针。
  8. 如果左链表还有剩余节点,将剩余节点连接到curr的后面。
  9. 如果右链表还有剩余节点,将剩余节点连接到curr的后面。
  10. 返回合并后的链表。

链表的Mergesort算法的优势在于它的时间复杂度为O(nlogn),且不需要额外的空间。它适用于对链表进行排序的场景。

腾讯云提供了多种云计算相关产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以参考腾讯云官方文档:腾讯云产品

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

相关·内容

Python 实现单向链表,和单向链表的反转

链表的定义链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息单向链表的实现python 代码解读复制代码class ListNode: def __init__...(self, val): self.val = val self.next = None要实现单向链表只需要把几个节点关联起来就可以了,把一个节点的next设置为另一个节点就可以了...,例如创建一个A->B->C 的单向链表可以这么写:python 代码解读复制代码 first_node = ListNode("A") second_node = ListNode("B") third_node...,先实例化Solution对象,然后调用reverse函数把链表的表头first_node 传进去:python 代码解读复制代码solution = Solution()result = solution.reverse...(first_node)如果你想查看这个链表的内容顺序,可以这样写:python 代码解读复制代码print(result.val, result.next.val, result.next.next.val

2700
  • Python实现单向链表

    关于链表的介绍,请参考:链表介绍 本篇文章使用 Python 来实现一个单向链表。 一、定义一个创建节点的类 链表是由一个个的节点组成的,在创建链表之前,要先创建节点,然后把节点“串”到链表上。...实现 show() 方法时,为了更形象地展示链表中每个节点的关系,我在相邻两个节点之间使用右箭头连接(空链表无效果)。...同时,上面实现了获取单向链表长度的方法 length(),返回链表当前的节点个数。...index(value):返回一个数据在链表中的第几个节点,与判断是否存在的实现方式一样,这里返回的是数据处于第几个节点中,如果链表中没有这个数据,则返回-1。...实现的单向链表及单向链表的一些简单操作方法。

    99720

    链表和双向链表的实现

    前言 ---- 链表中的数据通过指针连接,添加、插入或删除节点只需要修改指针指向 实现思路 实现一个链表需要具备以下方法 在链表尾部添加节点 获取链表所有节点的数据 链表指定位置插入元素 获取链表指定位置的节点数据...获取节点在链表中的位置 更新链表指定位置的数据 移除链表指定位置的节点 移除链表中的指定节点 判断链表是否为空 获取链表长度 链表内部需要定义head指针和链表长度 实现代码 定义head指针和length...(linkedList.size()) 双向链表 双向链表的指针是双向的,前指针指向上一个节点,后指针指向下一个节点 head指向第一个节点,tail指向最后一个节点 双向链表实现思路 需要具备以下方法...尾部插入元素 任意位置插入元素 获取所有节点数据 正向遍历链表获取节点数据 反向遍历链表获取节点数据 获取指定位置的节点数据 获取指定数据在链表中的位置 更新指定位置的节点数据 移除指定位置的节点 移除指定数据的节点...判断链表是否为空 获取链表长度 定义head和tail分别指向第一个节点和最后一个节点 代码实现 /** * 双向链表 */ function DoublyLinkedList() { //指向第一个节点

    71040

    python实现单链表

    8 import sys class Lnode():     def __init__(self,elem,next=None):         self.elem = elem    #节点的值...self):         L = Lnode(None,None)         self.head = L       #定义头节点         self.length = 0     #链表元素个数...    # 链表是否为空     def isempty(self):         if self.head.next is None:             return True         ...newNode.next = self.head.next             self.head.next = newNode         self.length += 1     #在指定元素的位置后面插入...                sys.stdout.write("%s " %(p.elem))             print             return     #查找元素,返回指向该元素的节点

    46930

    链表的实现

    链表之前我们已经介绍过,这章笔记我们就来通过C++语言实现一个简单的链表 C语言表示链表的一个节点 struct Node { int data; struct Node*link; } 上图: 头节点...首先链表有一个头节点,他没有数据,类型是节点指针 他负责标识这个链表,比如我现在这个头节点叫head ,如果head = NULL表示链表为空 如果head不为空则表示链表有节点。...通过malloc给节点在堆上分配内存 Node*temp = malloc(sizeof(Node)); 然后通过头节点指向这个节点 head = temp; 这样我们就创建了一个有节点的链表 我们想在已有的节点后面再创建一个节点该如何创建呢...=NULL) { temp = temp->link; } printf("the last data of Node is %d",temp->data); 很简单的逻辑 头节点是不可以被修改的,因为头结点是链表的标识...,如果修改掉链表标识,链表将无法成立

    14410

    链表的实现

    链表分为单向链表、双向链表和循环链表。链表这种数据结构就像是火车车厢一样,每个车厢可以插入到任意的的位置。...isEmpty(): 如果链表中不包含任何元素,返回 true,如果链表长度大于 0 则返回 false。 下面来一一进行实现。...先实现单向链表(上一个数据的指针指向下一个数据的存储地址),然后在这基础上实现双向链表和循环链表。这里使用 ES6 class 的形式来实现。...remove 方法可以结合 indexOf 方法和 removeAt 方法来实现。先通过 indexOf方法获取要删除元素的索引,然后通过索引去删除指定的元素。...false : this.removeAt(idx); } insert(index,elem) 方法 这个方法跟删除一个元素的实现思路很相似,也需要条件判断,也需要断开链表然后插入新的内容。

    53210

    Python 算法基础篇:链表和双向链表的实现与应用

    Python 算法基础篇:链表和双向链表的实现与应用 引言 链表和双向链表是常用的线性数据结构,它们在算法和程序设计中有着广泛的应用。...本篇博客将重点介绍链表和双向链表的原理、实现以及它们在不同场景下的应用。我们将使用 Python 来演示链表和双向链表的实现,并通过实例展示每一行代码的运行过程。 ❤️ ❤️ ❤️ 1....单向链表的实现与应用 2.1 单向链表的实现 下面是单向链表的 Python 实现: class ListNode: def __init__(self, val=0, next=None):...双向链表的实现与应用 3.1 双向链表的实现 下面是双向链表的 Python 实现: class DoubleListNode: def __init__(self, val=0, prev=None...我们通过使用 Python 来演示链表和双向链表的实现,并通过实例展示它们在不同场景下的应用。

    75220

    Python实现双向链表

    关于链表的介绍,请参考:链表介绍 本篇文章使用 Python 来实现双向链表。 一、定义一个创建节点的类 链表是由一个一个的节点组成的,在创建链表之前,要先创建节点,然后把节点“串”到链表上。...实现 show() 方法时,为了更形象地展示链表中每个节点的关系,我在相邻两个节点之间使用左箭头加右箭头连接(空链表无效果)。...同时,上面实现了获取双向链表长度的方法 length(),返回链表当前的节点个数。...index(value):返回一个数据在链表中的第几个节点,与判断是否存在的实现方式一样,这里返回的是数据处于第几个节点中,如果链表中不存在这个数据,则返回-1。...实现的双向链表及双向链表的一些简单操作方法。

    55530

    用python实现单链表的基础操作

    1 问题 用python实现单链表的基础操作:插入,删除,遍历,判空,清空链表,求长度,获取元素,判断元素是否存在。...2 方法 解决问题的步骤采用如下方式: 使用函数和类的方法来实现单链表的基本操作 插入操作时使用头插法 删除操作时,删除头节点一行代码即可,其他位置的需要判断+遍历 通过实验、实践等证明提出的方法是有效的..._head is None def length(self): """求链表的长度""" p = self....(9) linklist.remove(5) linklist.travel() linklist.clear() linklist.travel() 3 结语 针对用python...实现单链表的基础操作,通过python运行实验,证明该方法是有效的,这种设置方法代码较多,因此未来还需继续改善这种方法以适应更多场景。

    16210

    单链表的实现

    之前学习了顺序表,接下来把链表的功能给模拟实现一遍 链表 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。...链表的结构有很多种,但是我们重点掌握两种: 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。...整体结构就长这个样子 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。...链表的实现 第一个节点也称为头结点 head 依靠head 节点就可以找到所有的节点 单链表的模拟实现 creatList为我们已经创建好了一个链表,在它的基础上我们可以进行操作 实现接口的功能...一共实现的功能就这么多 现在我们先来一一实现 一.打印链表 注:一般情况不动head那个节点,创建一个cur节点来代替head节点,让它永远指向头结点 ​​​​​​public void display

    8310
    领券