给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:
输入:head = [4,2,1,3] 输出:[1,2,3,4]
示例 2:
输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目在范围
[0, 5 * 104]
内 -105 <= Node.val <= 105
解题思路:其实题目要求O(nlogn)时间复杂度和O(1)空间复杂度,所以重构链表肯定不合适,并且要用 nlogn的排序算法,这道题的最优解其实是归并排序,下篇博客写归并排序,先写一个暴力的,直接List存储val的值,然后排序加重构链表,代码如下:
class Solution {
public ListNode sortList(ListNode head) {
if(head == null){
return null;
}
List<Integer> nodeVal = new ArrayList();
while(head != null){
nodeVal.add(head.val);
head = head.next;
}
Collections.sort(nodeVal);
ListNode res = new ListNode(0);
ListNode node = res;
for(int i = 0 ; i < nodeVal.size() ; i++){
ListNode temp = new ListNode(nodeVal.get(i));
node.next = temp;
node = node.next;
}
return res.next;
}
}
提交截图:
总结:划个水,明天写归并