在破解编码访谈时,问题中提出了问题。作者提出的两种解决方案都涉及创建新的链表,从而产生O(N)时间和O(N)空间。她将这些解决方案称为最佳解决方案,我不确定为什么。是不是可以对随机排序的链表进行分区,使得小于x的所有节点在O(N)时间内大于或等于x的所有节点之前出现但是O(1)空间?
作者提出了两种解决方案。一种是创建两个链表,每个链表都有节点,其值大于/等于节点,另一个节点的值小于。填充后,她合并了列表。
她的另一个解决方案是创建一个新的链表并迭代传递给该方法的链表 - 那些大于或等于x的值被附加到尾节点以获取新的链表,那些小于x的值被放置在头节点之前。我相信这两个都是O(N)的时间和空间。
我实现的代码(希望它是正确的!)只是删除一个小于x的节点,并将其移向链表的头部。我相信O(N)时间和O(1)空间,但我怀疑我提出的算法比作者提出的更有效。如果我忽略了什么,请告诉我!代码如下:
def partition(head, val)
return nil if head.nil? || val.nil?
node = head
if node.val < val
min_node = node
end
until node.next.nil?
if node.next < val
#delete next node, so..
removed_node = node.next
node.next = node.next.next
if min_node.nil? #then head wasn't smaller than val
min_node = removed_node
min_node.next = head
else
removed_node.next = min_node
min_node = removed_node
end
else
node = node.next
end
end
end