Sort a linked list in O(n log n) time using constant space complexity.
使用o(nlogn)的时间复杂度和常量空间复杂度,对链表排序。
可以使用归并排序,符合时间复杂度和空间复杂度
<?php
class ListNode {
public $next = null;
public $val;
public function __construct($val) {
$this->val = $val;
}
}
function sortList($headNode) {
//空节点和只有一个节点直接返回
if ($headNode == null || $headNode->next == null) {
return $headNode;
}
//快慢指针获取中间节点,中间结点前一个节点分割
$fastNode = $headNode;
$node = $headNode;
$pre = $headNode;
while (!is_null($fastNode)) {
$pre = $node;
$node = $node->next;
$fastNode = $fastNode->next->next;
}
$halfNode = $node;
$pre->next = null;
$first = sortList($headNode);
$second = sortList($halfNode);
$head = sortMerge($first, $second);
return $head;
}
function sortMerge($first, $second) {
$pre = new ListNode(0);
$node = $pre;
while ($first != null && $second != null) {
if ($first->val > $second->val) {
$node->next = $first;
$first = $first->next;
} else {
$node->next = $second;
$second = $second->next;
}
$node = $node->next;
}
if ($first == null) {
$node->next = $second;
}
if ($second == null) {
$node->next = $first;
}
return $pre->next;
}
$node1 = new ListNode(3);
$node2 = new ListNode(9);
$node3 = new ListNode(0);
$node4 = new ListNode(4);
$node5 = new ListNode(5);
$node6 = new ListNode(11);
$node7 = new ListNode(8);
$node1->next = $node2;
$node2->next = $node3;
$node3->next = $node4;
$node4->next = $node5;
$node5->next = $node6;
$node6->next = $node7;
$node7->next = null;
$node = sortList($node1);
while($node !== null) {
print $node->val."\n";
$node = $node->next;
}