【发布时间】:2014-08-02 00:02:22
【问题描述】:
数组上的合并排序的空间复杂度为 O(n),而链表上的合并排序的空间复杂度为 O(log(n)),记录在 here
我相信我理解数组的情况,因为我们在合并两个子数组时需要辅助存储。但是链表合并排序不会只是合并两个子链表吗?我认为这将具有 O(1) 的空间复杂度来创建一个新的头部。
就地合并(无辅助存储):
public Node merge(Node a, Node b) {
Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
while(a !=null && b!= null) {
if(a.info <= b.info) { curr.next = a; a = a.next; }
else { curr.next = b; b = b.next; }
curr = curr.next;
}
curr.next = (a == null) ? b : a;
return dummyHead.next;
}
解释一下就好了。
【问题讨论】:
-
O(n) ?这一定是新事物。我知道最好的平均排序复杂度是 O(nlogn)。
-
@thecoder 问题是关于空间复杂度,而不是时间复杂度。
-
哦,那我道歉。我的错。
-
请注意,这是专门关于 递归 合并排序的。您可以编写空间复杂度为 O(1) 的迭代合并排序。
标签: arrays algorithm sorting linked-list