給你鍊錶的頭結點 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 =
輸出:歸併排序 遞迴
時間複雜度o(nlog(n))
空間複雜度o(log(n))
遞迴棧的空間複雜度
/**
* definition for singly-linked list.
* public class listnode
* listnode(int val)
* listnode(int val, listnode next)
* }*/class
solution
// 2、找到鍊錶中間節點並斷開鍊錶 & 遞迴下探
listnode middlehead =
middlehead
(head)
; listnode righthead = middlehead.next;
middlehead.next = null;
listnode left =
sortlist
(head)
; listnode right =
sortlist
(righthead)
;// 3、當前層業務操作(合併有序鍊錶)
return
mergetwolists
(left, right);}
// 找到鍊錶中間節點(876. 鍊錶的中間結點 如果有兩個中間節點,就找到前乙個)
private listnode middlehead
(listnode head)
return slow;
}// 合併兩個有序鍊錶(21. 合併兩個有序鍊錶)
public listnode mergetwolists
(listnode l1, listnode l2)
curnode.next = l1 != null ? l1 : l2;
return sentine.next;
}}
迭代歸併法bottom-to-up的歸併思路是這樣的:先兩個兩個的 merge,完成一趟後,再 4 個4個的 merge,直到結束。舉個簡單的例子:[4,3,1,7,8,9,2,11,5,6]
.
step=1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)
step=2: (1->3->4->7)->(2->8->9->11)->(5->6)
step=4: (1->2->3->4->7->8->9->11)->5->6
step=8: (1->2->3->4->5->6->7->8->9->11)
煉表裡操作最難掌握的應該就是各種斷鏈啊,然後再掛接啊。在這裡,我們主要用到鍊錶操作的兩個技術:
該思路來自leetcode
時間複雜度o(nlog(n))
空間複雜度o(1)
/**
* definition for singly-linked list.
* public class listnode
* listnode(int val)
* listnode(int val, listnode next)
* }*/class
solution
listnode tmp = head;
int len =0;
while
(tmp != null)
listnode dummy =
newlistnode()
; dummy.next = head;
for(
int size =
1; size < len; size *=2)
}return dummy.next;
}public listnode cut
(listnode node,
int size)
node = node.next;
size--;}
return null;
}// 合併兩個有序鍊錶(21. 合併兩個有序鍊錶)
public listnode mergetwolists
(listnode l1, listnode l2)
curnode.next = l1 != null ? l1 : l2;
return sentine.next;
}}
Leetcode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...
LeetCode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3輸出 1 2 3 4示例 2 輸入 1 5 3 4 0輸出 1 0 3 4 5歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...
leetcode148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 看到題目就知道要二分,這裡用的是遞迴版歸併 definition for singly linked list....