题目

分析
看到时间复杂度为O(nlogn),就联想到应该用二分查找或者归并排序。
之前求逆序对的时候有做过对数组的归并排序,但数组可以快速知道索引,从而得知中点。
链表可以使用快慢指针找到中点,但这里很重要的点是,找到中点之后,把原链表分为左右两个子链表时要注意将左链表最后一个节点的指针置空,也就是断链,否则就会一直递归导致栈溢出。
具体代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null){
return head;
}
//首先用快慢指针找到中点
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
ListNode tmp = slow.next;
slow.next = null;
ListNode left = sortList(head);
ListNode right = sortList(tmp);
ListNode res = merge(left,right);
return res;
}
public ListNode merge(ListNode left,ListNode right){
ListNode head = new ListNode(0);
ListNode tmp = head;
while(left != null && right != null){
if(left.val < right.val){
tmp.next = left;
left = left.next;
}else{
tmp.next = right;
right = right.next;
}
tmp = tmp.next;
}
tmp.next = left != null?left:right;
return head.next;
}
}
本文深入探讨了链表归并排序的实现方法,重点讲解了如何使用快慢指针找到链表中点,以及在分割链表时避免栈溢出的关键步骤。通过具体代码示例,展示了链表归并排序的全过程。
1404

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



