148.排序列表

3个考点:

第一个是如何把原始的nodelist进行分治,分割到最小的单元, 采用递归dfs方式

第二个考点是:merge 归并排序 ,以及细节考点:过程中考虑到 创建的新node 如何和之前的节点进行指针的拼接

# 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]:
        #判空处理 && 递归到 node->null 的情况
        if (not head) or (not head.next):
            return head 
        
        slow=head 
        fast =head.next 
        while fast and fast.next:
            slow =slow.next 
            fast =fast.next.next
        #后半部分
        second_half_head=slow.next 
        #前半部分的末尾切断
        slow.next =None

        #2.排序 
        sorted_first_half =self.sortList(head)
        sorted_second_half= self.sortList(second_half_head)
        #3.merge
        return self.merge(sorted_first_half,sorted_second_half)

    def merge (self,left,right):
        #创建一个新的
        dummy_head=ListNode(-1)
        tail =dummy_head 
        while left and right :#2个list都有节点迭代时候
            if left.val <right.val:
                tail.next=left
                left=left.next
            else:
                tail.next =right
                right=right.next
            tail =tail.next 
        if left :
            tail.next =left
        else:
            tail.next =right
        return  dummy_head.next 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值