【力扣100】【好题】148.排序链表

添加链接描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # 思路是使用分治法,首先先把链表递归一分为二,然后使用额外一个节点排序
        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=self.sortList(head)
        right=self.sortList(mid)

        ans=res=ListNode(0)
        while left and right:
            if left.val<right.val:
                res.next=left
                left=left.next
            else:
                res.next=right
                right=right.next
            res=res.next
        if left:
            res.next=left
        if right:
            res.next=right
        return ans.next

思路:

  1. 分治法:【力扣100】【好题】148.排序链表_第1张图片
  2. 【分的部分】把整个链表一分为二,然后不断递归,直到分到最小为止
  3. 【和的部分】定义一个辅助节点,左右排序,然后还有某一遍走完,就把另外一边剩下的全部加进来
  4. 这道题值得反复做。


亮点:

使用快慢指针找到中间节点
辅助链表的排序
这道题值得反复做

你可能感兴趣的:(leetcode,链表,算法)