148. 排序链表 - 力扣(LeetCode)

暴力算法

python 复制代码
# encoding = utf-8
# 开发者:Alen
# 开发时间: 10:51 
# "Stay hungry,stay foolish."

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution(object):
    def sortList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        # Step 1: 提取所有值
        cur = head
        values = []
        while cur:
            values.append(cur.val)
            cur = cur.next

        # Step 2: 排序(注意:题目是排序链表,不是反转!)
        values.sort()  # 升序排序

        # Step 3: 重建链表
        dummy = ListNode(0)  # 哑节点,方便操作
        current = dummy
        for val in values:
            current.next = ListNode(val)
            current = current.next

        return dummy.next

归并算法

大佬图示:

代码:

python 复制代码
# encoding = utf-8
# 开发者:Alen
# 开发时间: 10:51 
# "Stay hungry,stay foolish."

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution(object):
    def sortList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        if not head or not head.next:
            return head

        left = head
        right = self.getMid(head)
        tmp = right.next
        right.next = None
        right = tmp

        left = self.sortList(left)
        right = self.sortList(right)
        return self.merge(left, right)

    def getMid(self, head):
        fast = head.next
        slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        return slow

    def merge(self, list1, list2):
        tail = dummy = ListNode()
        while list1 and list2:
            if list1.val < list2.val:
                tail.next = list1
                list1 = list1.next
            else:
                tail.next = list2
                list2 = list2.next
            tail = tail.next

        # 其中一个链为None,另一个可能不是None
        if list1:
            tail.next = list1

        if list2:
            tail.next = list2

        return dummy.next

结果

解题步骤:

相关推荐
by209999 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
Code_Solitude9 小时前
c语言:关于qsoet函数知识点
c语言·数据结构·算法
Nil20810 小时前
leetcode 49字母异位分组
算法·leetcode·哈希算法
Pniubi10 小时前
快速排序(力扣基础)(递归)
java·数据结构·算法
lojox11 小时前
C++ 手写 STL list(双向循环链表)原理剖析与实现
c++·链表·list
inrichtt20 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger21 小时前
数据结构——选择排序
数据结构·算法·排序算法
丑梨数据1 天前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓1 天前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
Nil2081 天前
leetcode 5最长回文子串
算法·leetcode·职场和发展