【问题标题】:Merge Two Link List in Python在 Python 中合并两个链表
【发布时间】:2018-09-29 00:15:53
【问题描述】:

合并两个已排序的链表并将其作为新链表返回。应该通过将前两个列表的节点拼接在一起来制作新列表。

我已经差不多完成了。我无法让它工作。任何使其工作的提示将不胜感激。

class node():
    def __init__(self, data, next_node):
        self.data = data
        self.next_node = None

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next_node

    def set_next(self, new_node):
        self.next_node = new_node

class LinkList(object):

    def __init__(self, head = None):
        self.head = head

    def add(self, data):
        new_node = node(data)
        new_node.set_next(self.head)
        self.head = new_node

    def printlist(self):
        current_node = self.head
        while (current_node != None):
            print(current_node.get_data(), end="->")
            current_node = current_node.get_next()


def merge(L1, L2):

    temp = None

    if L1 is None:
        return L2

    if L2 is None:
        return L1

    if L1.data <= L2.data:
        temp = L1
        temp.next_node = merge(L1.next_node, L2)

    else:
        temp = L2
        temp.next_node = merge(L1,L2.next_node)

        return temp


def main():

    list1 = LinkList()
    list1.add(10)
    list1.add(20)
    list1.add(30)

    list2 = LinkList()
    list2.add(10)
    list2.add(30)
    list2.add(50)

    list3 = LinkList()

    list3.head = merge(list1.head, list2.head)
    print("merge link list: ", end=" " )
    list3.printlist()
if __name__ == "__main__":
    main()

【问题讨论】:

  • 哪个部分不起作用?你的错误到底是什么?
  • 1.在添加函数中,我得到类型错误:__init__() 缺少 1 个必需的位置参数:'next_node'。
  • 我不知道你这样做是为了课堂作业还是什么。但是,在一次谷歌面试中,我被问到如何在 python 中制作一个链表……我只是认为这是在浪费时间。 Python 内置了列表,您不应该“自己动手”。特别是由于python没有指针,所以完全没有理由在python中实现链表,零教育收益。

标签: python python-3.x


【解决方案1】:

由于您要添加到列表的头部:

def add(self, data):
    new_node = node(data)
    new_node.set_next(self.head)
    self.head = new_node

这意味着您的列表颠倒了。因此,您必须在合并期间进行反向检查:

if L1.data >= L2.data:

全文:

class node():
    def __init__(self, data, next_node = None):
        self.data = data
        self.next_node = next_node

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next_node

    def set_next(self, new_node):
        self.next_node = new_node

class LinkList(object):

    def __init__(self, head = None):
        self.head = head

    def add(self, data):
        new_node = node(data)
        new_node.set_next(self.head)
        self.head = new_node

    def printlist(self):
        current_node = self.head
        while (current_node != None):
            print (current_node.get_data(), end = "->")
            current_node = current_node.get_next()
        print ()

def merge(L1, L2):

    temp = None

    if L1 is None:
        return L2

    if L2 is None:
        return L1
    if L1.data >= L2.data:
        temp = L1
        temp.next_node = merge(L1.next_node, L2)
    else:
        temp = L2
        temp.next_node = merge(L1, L2.next_node)

    return temp


def main():

    list1 = LinkList()
    list1.add(10)
    list1.add(20)
    list1.add(30)

    print("list2: ", end=" " )
    list1.printlist()

    list2 = LinkList()
    list2.add(11)
    list2.add(21)
    list2.add(51)
    print("list2: ", end=" " )
    list2.printlist()

    list3 = LinkList()

    list3.head = merge(list1.head, list2.head)
    print("merge link list: ", end=" " )
    list3.printlist()

if __name__ == "__main__":
    main()

【讨论】:

  • 目前它以降序输出。我怎样才能按升序获得它。
【解决方案2】:

你只传递 data 参数,所以设置 next_node 默认值 None

class node:
    def __init__(self, data, next_node=None):
        self.data = data
        self.next_node = None

下面是升序排序的解

class Node(object):
    def __init__(self, data):
        self.data = data
        self.next = None

    def __str__(self):
        return "<Node>{}</Node> {}".format(self.data, self.next)


class LinkList(object):
    def __init__(self):
        self.current = self.head = None

    def add(self, node):
        if not self.head:
            self.head = self.current = node
        else:
            self.current.next = node
            self.current = node

    def __str__(self):
        return "<head>{}</head> {}".format(self.head.data, self.head.next)


def merge(lst1, lst2):
    rtn = LinkList()
    while lst1 and lst2:
        if lst1.data < lst2.data:
            rtn.add(Node(lst1.data))
            lst1 = lst1.next
        else:
            rtn.add(Node(lst2.data))
            lst2 = lst2.next
    if lst1:
        rtn.add(lst1)
    if lst2:
        rtn.add(lst2)
    return rtn


def main():
    lst = LinkList()
    lst.add(Node(1))
    lst.add(Node(2))
    lst.add(Node(3))
    lst2 = LinkList()
    lst2.add(Node(1.1))
    lst2.add(Node(2.1))
    lst2.add(Node(3.1))
    rtn = merge(lst.head, lst2.head)
    print(rtn)


if __name__ == '__main__':
    main()

【讨论】:

  • 由于self.next_node 在函数体中被显式设置为None,所以next_node 甚至没有理由出现在函数签名中。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2021-02-26
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多