我目前正在练习或面试,并且正在对链接列表问题进行合并排序。
给出一个链表(具有next
和val
属性),4-2-1-3
,我应该在1-2-3-4
中将其排序为O(nlogn)
。因此,我尝试使用合并排序到链表。下面是我的代码。
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head.next:
# find mid point
mid = fast = head
while fast.next and fast.next.next:
mid = mid.next
fast = fast.next.next
# split linkedList into two
L = head
R = mid.next
mid.next = None
# recursively call mergeSort to Left and Right Lists
self.sortList(L)
self.sortList(R)
# pointers for merging
newPtr = newHead = ListNode(-1)
newHead.next = newPtr
# merge and sort
while L and R:
if L.val < R.val:
newPtr.next = L
L = L.next
else:
newPtr.next = R
R = R.next
newPtr = newPtr.next
# for remaining nodes
while L:
newPtr.next = L
newPtr = newPtr.next
L = L.next
while R:
newPtr.next = R
newPtr = newPtr.next
R = R.next
return newHead.next
else:
return head
我觉得我的合并排序算法是正确的,但是上面输入的结果使我1-3-4
缺少了2
。
我认为我真的很接近,但是我不确定我搞砸了哪一部分。
请帮助。
编辑
我通过将L
和R
更改为l1
和l2
并进行更改来解决了问题
self.sortList(L)
self.sortList(R)
此
L = self.sortList(l1)
R = self.sortList(l2)
其他部分相同,现在我有相同的答案。但是,我不确定更改如何产生影响。
答案 0 :(得分:2)
当递归调用sortList时,局部函数变量R和L可能不再是其各自列表段的开头。然后,随后的合并操作将“跳过”排序列表中原始节点之前的部分,从而导致输出不完整。
您的更改通过将R和L分配给排序链的头来确保R和L具有合并的每个子列表的有效头。