Sort a linked list in O(n log n) time using constant space complexity.
public
class
Solution {
public
ListNode sortList(ListNode head) {
if
(head==
null
||head.next==
null
)
return
head;
ListNode mid = getMid(head);
ListNode right = sortList(mid.next);
mid.next =
null
;
ListNode left = sortList(head);
return
mergeSort(left, right);
}
private
ListNode getMid(ListNode head){
ListNode temp = head.next;
ListNode mid = head;
while
(temp!=
null
&&temp.next!=
null
){
mid = mid.next;
temp = temp.next.next;
}
return
mid;
}
private
ListNode mergeSort(ListNode left,ListNode right){
if
(left==
null
)
return
right;
if
(right==
null
)
return
left;
ListNode head =
null
;
if
(left.val>right.val){
head = right;
right = right.next;
}
else
{
head = left;
left = left.next;
}
ListNode temp = head;
while
(right!=
null
&&left!=
null
){
if
(left.val>right.val){
temp.next = right;
right = right.next;
}
else
{
temp.next = left;
left = left.next;
}
temp = temp.next;
}
if
(right!=
null
){
temp.next = right;
}
if
(left!=
null
){
temp.next = left;
}
return
head;
}
}
1 虫洞
ListNode right = sortList(mid.next);
mid.next =
null
;
ListNode left = sortList(head);这样的我叫他们虫洞,我们需要跳进去,将一切任务完成,执行到底。我们终于出了这个虫洞,但我们才发现我们只是在另一个虫洞的一个步骤上。
那就继续努力,一层一层虫洞向上爬。终于有一天,我们彻底走出。
归并:
归并的思想核心在于由大化小,细化到底层,两两比较,再逐步往上走。每一层都是排序过的。短短几句,却完成的是如此大型的任务,真的一种奇迹。
研究算法最重要的是:1 把这作为最重要的事业,记住除了她,其他一切都不重要。世界与你无关,他人的过失与你无关。慢慢的,走进算法的世界,这里有最 奇妙的思路,最大也最小的操作。堪称神作。
2 当一个算法非常复杂,感觉无法征服她的时候,就根据样本,一步一步推演。只要掌握了一些重要的点,重要的思想,重要的规避点后,算法便可以理解。
3 研究算法时,不用刻意专心。算法的美妙之处在于她能带你走入心无旁骛的状态,心烦意乱,研究研究算法便能安静下来。有烦心的事,亲近算法。她能给你最温柔的安慰