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 



### Java 链表排序方法 #### 归并排序应用于双向链表 对于Java中的双向链表,一种高效的排序方式是采用归并排序算法。此算法通过递归的方式不断分割列表直到每个子列表仅含单个节点或为空,之后再逐步合并这些有序的小片段形成最终完全排序的大列表[^2]。 具体操作流程如下: - 使用快慢指针法来定位中间位置从而划分成两半; - 对每半个继续执行相同逻辑直至不能再分; - 将各段按升序重新组合起来; 以下是基于上述原理编写的`DoublyLinkedList`类的部分源码展示用于说明如何实现这一功能[^1]: ```java public class DoublyLinkedList { private Node head; // ...其他成员变量和辅助函数... /** Sorts the linked list using merge sort algorithm */ public void sort() { if (head == null || head.next == null) return; // Already sorted or empty head = divide(head); } /** Divides and sorts recursively, then merges two halves of the list */ private Node divide(Node node){ if(node==null||node.next==null)return node; Node mid=findMid(node); // Find midpoint with slow/fast pointers technique. Node secondHalfStart=mid.next; mid.next=null;// Split into two lists. Node leftSorted=divide(node); // Recursively apply on both parts. Node rightSorted=divide(secondHalfStart); return merge(leftSorted,rightSorted);// Merge them back together after sorting. } } ``` 为了完成整个程序还需要编写`findMid()`以及`merge()`这两个帮助性的私有方法,在这里省略了具体的细节以便聚焦于核心概念之上。 另外值得注意的是,除了归并排序之外还有其他的排序策略适用于不同场景下的需求,比如插入排序就非常适合处理几乎已经是顺序排列的数据集[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值