LeetCode | 148. 排序链表
原题 ( Medium ): 在 O ( n log n ) 时间复杂度和常数级空间复杂度下,对链表进行排序。 思路:自底向上(bottom-to-up)、归并排序(Merge Sort) 题目对时间复杂度和空间复杂度做出了要求,常用的对数级别的排序方法不多,由于这里并不是双向链表,所以快排不太可能,可以使用 归并 ,但一般的归并是需要一辅助数组的,空间复杂度为O(n),自然不能按一般归并的思路。我们可以考虑自底向上的归并,而非自上而下的递归归并,就是直接从两两合并开始,然后四四合并.......直到结束。 那么怎么把链表两两分开再两两合并呢?首先使用一整型变量size记录每轮需要两两分开和归并的节点数量,就是一个每次两倍倍增的数值(1、2、4....),我们可以使用 位运算 实现两倍倍增。然后怎么分开呢?要怎样把链表每两个节点分开成左右各一个,如stpe1一样?我们需要利用这个size把链表切开(step1的size为1),从链表头开始, 走过size个节点 (包括头节点)后,把链表 断开 ,断开后左边就是左半部分,右边的size个就是右半部分,例如4->3->...,断开后就变成了4,3->....,此时4就是左半部分,3就是右半部分,怎么把右半部分在链表中确认下来?继续把链表切开,从3( 右半部分的起点 )出发, 走过size个节点 (包括出发的节点)后