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

结果

解题步骤:

相关推荐
hold?fish:palm2 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle2 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b3 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨3 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz3 小时前
算法:回溯算法
c++·算法·leetcode
zephyr054 小时前
数据结构-并查集
数据结构
稚南城才子,乌衣巷风流4 小时前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
zander2585 小时前
114. 二叉树展开为链表
数据结构·链表·深度优先
小肝一下6 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra