【问题标题】:Recursing two linked list simultaneously同时递归两个链表
【发布时间】:2019-02-27 01:13:26
【问题描述】:

我目前正在尝试创建一个递归的两个链表函数,它同时返回链表值的单个值。

例如,有两个链表:ll1 -> a, b, c 和 ll2 -> d, e, f

它将递归地返回a、d、b、e、f,(下面有我正在尝试做的代码段,这将更有意义!)

class LinkedList:
    created = 0
    def __init__(self,value,next=None):
        self.value = value
        self.next  = next
        LinkedList.created  += 1

def convert_linked_list(l):
    if l == []:
        return None
    front = rear = LinkedList(l[0])
    for v in l[1:]:
        rear.next = LinkedList(v)
        rear = rear.next
    return front

def convert_linked_str(ll):
    answer = ''
    while ll != None:
        answer += str(ll.value)+'->'
        ll = ll.next
    return answer + 'None'

这是我写的递归链表函数。

def recursive_lls(ll1: LinkedList, ll2: LinkedList) -> LinkedList:
    if ll1 == None or ll2 == None:
        return None
    else:
        alternate = LinkedList(ll1.value, recursive_lls(ll1.next, ll2.next))
    return alternate

ll1 = convert_linked_list(['n',3 ,'z','d'])
ll2 = convert_linked_list(['w','x',7 ,'g','e',1])
print(convert_linked_str(recursive_lls(ll1,ll2)))

它会给我一个结果:

n->3->z->d->None

但是想要的结果是:

n->w->3->x->z->7->d->g->e->1->None
  • 结果始终以 ll1 头值开头
  • ll1 和 ll2 可以是不均匀的长度,如果 ll2 值用完,那么 ll1 会继续(可以是其他方式)

用我目前拥有的方法来处理这个递归函数的最佳方法是什么?我知道使用类而不是辅助函数会更容易。

  • 必须是递归的,不能循环
  • 没有花哨的进口(拉链等)

还有如果它的single递归链表函数,这就是我在下面写的。但是对于两个链表,我真的很困惑。

def single_recursive_ll(ll):
    if ll == None:
        return None
    elif ll.next == None:
        return LN(ll.value)
    else:
        return_ll = LN(ll.value, single_recursive_ll(ll.next))
        if return_ll.value == return_ll.next.value:
            return_ll = return_ll.next
return return_ll 

【问题讨论】:

    标签: python recursion linked-list


    【解决方案1】:

    您的recursive_lls 函数存在一些问题。

    1. ll1ll2None 时终止
    2. 在对LinkedList 的调用中,recursive_lls 不会在第一个参数位置交替链表。此外,它总是在推进第二个链表所以你最终得到的是ll1中的最小链表,其长度不超过ll2的长度

    修复方法如下:

    1. 调整递归调用的基本情况,使两个链表完全固定。
    2. 调整递归调用以确保列表实际上是交替的。

    下面的代码就是这样做的

    def recursive_lls(ll1: LinkedList, ll2: LinkedList) -> LinkedList:
        if ll1 == None:
            return ll2
        if ll2 == None:
            return ll1
        else:
            alternate = LinkedList(ll1.value, recursive_lls(ll2, ll1.next))
        return alternate
    

    测试表明它现在按预期运行:

    >>> ll1 = convert_linked_list(['n',3 ,'z','d'])
    >>> ll2 = convert_linked_list(['w','x',7 ,'g','e',1])
    >>> print(convert_linked_str(recursive_lls(ll1,ll2)))
    n->w->3->x->z->7->d->g->e->1->None
    

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多