首页 > 其他分享 >148. 排序链表

148. 排序链表

时间:2024-12-27 17:19:34浏览次数:5  
标签:None slow fast next 链表 148 排序

  1. 题目链接

  2. 解题思路:在链表上使用排序算法。注意,不能使用快排,因为快排的最差时间复杂度是O(n^2),数组形式的快排,以随机数划分能够得到O(n*logn),但是链表的形式,不太好以随机数的方式划分。所以最好的排序方法是使用归并排序。

    • 先用快慢指针,将链表分成两部分,然后两部分分别归并排序,得到两个链表的头和尾。然后再merge即可
  3. 代码

    class Solution:
    
    
        def process(self, node: Optional[ListNode]) -> (Optional[ListNode], Optional[ListNode]):
            slow = node
            if slow.next == None:
                return slow, slow
            fast = slow.next
            while fast and fast.next:
                slow = slow.next
                fast = fast.next
                if fast == None:
                    break
                fast = fast.next
            # 分别有序
            tmp = slow.next
            slow.next = None
            head1, tail1 = self.process(node)
            head2, tail2 = self.process(tmp)
            # 合并
            ans_head  = None
            ans_tail = tail1 if tail1.val >= tail2.val else tail2
            if head1.val <= head2.val:
                ans_head = head1
                head1 = head1.next
            else:
                ans_head = head2
                head2 = head2.next
            cur = ans_head
            while head1 and head2:
                if head1.val <= head2.val:
                    cur.next = head1
                    head1 = head1.next
                else:
                    cur.next = head2
                    head2 = head2.next
                cur = cur.next
            if head1:
                cur.next = head1
            if head2:
                cur.next = head2
    
            return ans_head, ans_tail
    
    
    
        def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
            if head == None:
                return None
            head1, _ = self.process(head)
            return head1
    

标签:None,slow,fast,next,链表,148,排序
From: https://www.cnblogs.com/ouyangxx/p/18636283

相关文章

  • 141. 环形链表
    题目链接解题思路:一个快指针,一个慢指针,如果二者相等了,说明有环。如果快指针为空了,说明没环代码#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:defhas......
  • Python数据结构之双向循环链表
    1、循环双向链表特点通过当前结点直接获取上一结点通过头结点的上一结点直接可以去找到尾结点可以进行反向循环链表,即反转链表2、头结点链表头:在数据结构中,链表是一种常见的存储结构。链表的每个节点包含数据和指向下一个节点的指针。链表头是链表的第一个节点,它在链表的......
  • 【Redis Zset】Redis Zset多字段排序方案设计
    背景最近拿到多个排行榜相关的需求,按财富值,魅力值等单个或多个字段进行排序默认取前N条数据,考虑使用Redis进行排行榜实现,数据结构使用zset,本文对财富值和魅力值二个或多个字段排序的思路进行说明; 需求背景排行榜,按财富值和魅力值进行倒序排序,优先财富值排序,财富值相同则取魅......
  • GTM148学习(抄书)笔记 [不定期更新]
    ContentsContentsChapterI.GroupsandHomomorphismsPermutationsCyclesFactorizationintoDisjointCyclesEvenandOddPermutationsSemigroupsGroupsHomomorphismsChapterI.GroupsandHomomorphismsPermutationsDefinition1.1.1If\(X\)isan......
  • 闲来无事,写一个排序分页加去重的逻辑
    实际场景中可能需要对t2表中的字段加筛选条件,这里进行了简化。 --------------------------------Tablestructurefort_main_group------------------------------DROPTABLEIFEXISTS`t_main_group`;CREATETABLE`t_main_group`(`id`varchar(36)CHARACTERSET......
  • c语言实现重要算法二分查找和归并排序
    如有错误,请大佬指正,谢谢!前言二分查找和归并排序在c语言的算法学习中尤为重要,学会掌握这两种方法可以帮助我们解决数组排序和数组某元素查找的问题,尤其是在处理数据较多的时候。目录文章目录前言一、介绍一下二分查找和归并排序的概念和优点二、二分查找的实现三.归并......
  • 数据结构--双向循环链表
    之前我们写过了单链表的博文了,我们发现这是不是找头找尾有点麻烦啊。这里让我们来引入是双向带头的循环的链表。双向循环链表至此,正文开始:首先让我们来区分什么几种类型:类型单向链表,双向链表,带头/不带头,循环/不循环1.单向链表2.双向链表: 3.带头/不带头4.循环/非......
  • C中链表与数组的比较方法是什么?
    C中链表与数组的比较方法在C语言中,链表和数组是两种常用的数据结构,它们在数据存储和访问上各有优势。下面将详细比较这两种数据结构,并给出示例代码。1.内存分配「数组」:数组在内存中占用连续空间,所有元素按顺序排列。这种连续性使得数组的内存分配和访问非常高效。「链表」......
  • C中单链表反序的实现方法是什么?
    C中单链表反序的实现方法在C语言中,单链表的反序操作可以通过多种方法实现,主要包括迭代法和递归法。以下是详细的实现步骤和示例代码。迭代法实现单链表反序迭代法是通过遍历链表,将当前节点的指针指向前一个节点,从而实现链表的逆序。具体步骤如下:「定义节点结构体」:定义一个......
  • 常用的排序算法的时间复杂度
    以下是常见排序算法的时间复杂度对比表,包含了最优、平均和最坏情况下的时间复杂度:排序算法最优时间复杂度平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n)O(n²)O(n²)O(1)稳定选择排序O(n²)O(n²)O(n²)O(1)不稳定插入排序O(n)O(n²)O(n²)O(1)稳定归并排序O(nl......