python3中两个已排序的链接列表的交集?

时间:2017-08-18 12:19:38

标签: python algorithm python-3.x data-structures linked-list

我的代码无法打印出新列表,这是两个已排序链表的交集。它无法访问函数内的列表。请指出我的代码中的错误。我的代码中没有缩进问题,算法似乎也没问题。

class Node(object):

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

class Linked(object):

    def __init__(self):
        self.head = None

    def push(self,n):
        new_node = Node(n)
        new_node.next = self.head
        self.head = new_node

    def print_list(self):
        current = self.head
        while current:
            print(current.data)
            current = current.next

    def intersect(self,l1,l2):
        l1 = l1.head
        l2 = l2.head
        dummy = cur = Node(0)
        while l1 and l2:
            if l2.data>l1.data:
                l1=l1.next
            elif l1.data>l2.data:
                l2=l2.next
            else:
                cur.next = l1 or l2
                l1 = l1.next
                l2 = l2.next
            cur = cur.next
        return dummy.next
llist = Linked()
llist1 = Linked()
llist.push(6)
llist.push(4)
llist.push(3)
llist.push(2)
llist.push(1)
llist1.push(8)
llist1.push(6)
llist1.push(4)
llist1.push(2)
l = Linked()
print(l.intersect(llist,llist1).data)

这是追溯:

 Traceback (most recent call last):
  File "C:/Users/omsai/Desktop/intersection.py", line 48, in <module>
    print(l.intersect(llist,llist1).data)
  File "C:/Users/omsai/Desktop/intersection.py", line 26, in intersect
    if l2.data>l1.data:
AttributeError: 'Linked' object has no attribute 'data'

1 个答案:

答案 0 :(得分:2)

您正在使用Linked.intersect的两个实例调用Linked,但data成员没有intersect成员。您需要使用def intersect(self,l1,l2): l1 = l1.head l2 = l2.head dummy = cur = Node(0) # ... 方法获取实际节点:

intersect

你可能不需要用两个参数来调用def intersect(self, olinked): thisone = self.head otherone = olinked.head retval = Linked() while thisone and otherone: if otherone.data > thisone.data: thisone = thisone.next elif thisone.data > otherone.data: otherone = otherone.next else: # thisone.data == otherone.data retval.push(otherone.data) thisone = thisone.next otherone = otherone.next return retval # ... llist.intersect(llist1).print_list() ;将一个列表与另一个列表相交就足够了:

&