148. 排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
class Solution {
// 解题思路归并排序
public ListNode sortList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode fast=head.next,slow=head;
while(fast!=null && fast.next!=null){
slow = slow.next;
//三个节点以上的时候 fast==null
// 四个节点的时候 slow=2 fast=2
// 5个节点的时候
fast = fast.next.next;
}
//当只有两个节点的时候 tmp =head
ListNode tmp = slow.next;
slow.next = null;
ListNode left = sortList(head);
ListNode right = sortList(tmp);
//虚拟头结点
ListNode h = new ListNode(0);
ListNode res = h;
while(left!=null && right!=null){
if(left.val<right.val){
h.next = left;
left = left.next;
}else{
h.next = right;
right = right.next;
}
h = h.next;
}
h.next = left!=null?left:right;
return res.next;
}
}

该博客介绍了如何使用归并排序算法在O(nlogn)时间复杂度和常数级空间复杂度下对链表进行排序。通过创建快慢指针找到链表中间点,然后递归地将链表分为两半并分别排序,最后通过合并两个已排序的链表得到最终结果。示例展示了对不同链表结构的排序操作。

207

被折叠的 条评论
为什么被折叠?



