解题思路:
由时间复杂度O(nlogn)
知道我们可以使用归并排序
归并排序经常会出现在合并两个有序链表这样类似的题中
-
定义
fast
指针和slow
指针, 利用fast
和slow
将链表从中点分为两个链表
① 对应操作:
slow = slow.next;
fast = fast.next.next;
此时slow
指针刚好停在链表的中点
② 将链表从中间断开的操作:
slow.next = null;
③ 此时左右两个断开的链表的第一个节点分别为head
和tmp
-
对左右两个断开的链表递归进行如下操作
操作为:
ListNode left = sortList(head);
ListNode right = sortList(tmp);
递归终止条件:head.next = null;
, 意味着只剩下一个节点 -
将两个排序链表合并, 合并为一个排序链表
① 创建一个傀儡节点dum
② 创建指针left
和指针right
, 分别指向左右两个链表的头部, 比较两指针处节点值大小, 由小到大加入合并链表头部, 指针交替前进