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

结果

解题步骤:

相关推荐
英英_11 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫11 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
程序员-King.13 小时前
day143—递归—对称二叉树(LeetCode-101)
数据结构·算法·leetcode·二叉树·递归
Ethan-D16 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
仙俊红16 小时前
LeetCode174双周赛T3
数据结构·算法
橘颂TA16 小时前
【剑斩OFFER】算法的暴力美学——LeetCode 733 题:图像渲染
算法·leetcode·职场和发展
仍然.16 小时前
JavaDataStructure---二叉搜索树,哈希表,Map和Set
数据结构·散列表
程序员-King.17 小时前
链表——算法总结与新手教学指南
数据结构·算法·链表
FMRbpm18 小时前
树的练习6--------938.二叉搜索树的范围和
数据结构·c++·算法·leetcode·职场和发展·新手入门