import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
//拆表
public ListNode sortList (ListNode head) {
if(head == null || head.next == null) return head; //为什么这里是两个条件都可以终止,因为head.next == null是前半部分终止的条件,head == null是后半部分终止的条件
// 快慢指针,slow到达中间,fast到达末尾。利用快指针一次跑俩,慢指针1次跑一来找到
ListNode slow = head, fast = head.next;
while(fast != null && fast.next != null){ //等快指针指向空或快指针的下一位指向空 就说明慢指针是指向中间辽~
//为什么要同时判断当前节点和下一个结点都为空,才能判断是链表结尾? 有没有一种可能,链表当中存在空结点?
slow = slow.next;
fast = fast.next.next;
}
ListNode right = sortList(slow.next);
slow.next = null; //在中间结点处,断开链表
ListNode left = sortList(head);
return merge(left, right);
}
//合并
ListNode merge(ListNode left, ListNode right){
if(left == null) return right;
if(right == null) return left;
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while(left != null && right != null){
if(left.val > right.val){
head.next = right;
right = right.next;
}
else {
head.next = left;
left = left.next;
}
head = head.next;
}
if(left != null) head.next = left;
if(right != null) head.next = right;
return dummy.next;
}
}
要是还不懂就看看这一篇
https://blog.csdn.net/qq_45704942/article/details/116723910
算法思想(大白话)
目标:一串无序的结点,现在需要我们排成一串有序的结点。
怎么做?
①首先,把这一串结点从中间结点划分开
②想办法把左边的结点排好序,想办法再把右边的结点排好序(当然了,在排序左边的结点中我们还可以从中间再划分一半,不断递归下去)
③最后把两边的结点合并