2014-03-19 57 views
2

这里是我的代码:合并两个排序链表到一个链表在Python

def merge_lists(head1, head2): 
    if head1 is None and head2 is None: 
     return None 
    if head1 is None: 
     return head2 
    if head2 is None: 
     return head1 
    if head1.value < head2.value: 
     temp = head1 
    else: 
     temp = head2 
    while head1 != None and head2 != None: 
     if head1.value < head2.value: 
      temp.next = head1 
      head1 = head1.next 
     else: 
      temp.next = head2 
      head2 = head2.next 
    if head1 is None: 
     temp.next = head2 
    else: 
     temp.next = head1 
    return temp 
    pass 

这里被无限stucked loop.can任何一个问题告诉我是什么问题

的实例是:

assert [] == merge_lists([],[]) 
assert [1,2,3] == merge_lists([1,2,3], []) 
assert [1,2,3] == merge_lists([], [1,2,3]) 
assert [1,1,2,2,3,3,4,5] == merge_lists([1,2,3], [1,2,3,4,5]) 
+2

Python本地列表成员不具有“head”和“value”属性。你的例子不能按原样运行。 – mtrw

+0

我没有得到你的观点你能否更清楚地告诉我@mtrw –

+0

@srikarthikmodukuri我们不知道'head1'和'head2'是指什么 - 你没有将它们包含在代码示例中。请做。 – selllikesybok

回答

8

与当前代码的问题是,它会导致的副作用它定位到下一个临时节点的下一个之前来自当前节点的节点。当当前临时节点是当前节点的时,这是有问题的。

也就是说,想象这种情况下:

temp = N 
temp.next = N # which means N.next = N 
N = N.next  # but from above N = (N.next = N) -> N = N 

有一个修正版本,与一些其他更新:

def merge_lists(head1, head2): 
    if head1 is None: 
     return head2 
    if head2 is None: 
     return head1 

    # create dummy node to avoid additional checks in loop 
    s = t = node() 
    while not (head1 is None or head2 is None): 
     if head1.value < head2.value: 
      # remember current low-node 
      c = head1 
      # follow ->next 
      head1 = head1.next 
     else: 
      # remember current low-node 
      c = head2 
      # follow ->next 
      head2 = head2.next 

     # only mutate the node AFTER we have followed ->next 
     t.next = c   
     # and make sure we also advance the temp 
     t = t.next 

    t.next = head1 or head2 

    # return tail of dummy node 
    return s.next 
+0

似乎很困惑。谢谢 –

2

递归算法合并两个排序链表

def merge_lists(h1, h2): 
    if h1 is None: 
     return h2 
    if h2 is None: 
     return h1 

    if (h1.value < h2.value): 
     h1.next = merge_lists(h1.next, h2) 
     return h1 
    else: 
     h2.next = merge_lists(h2.next, h1) 
     return h2