NameError: имя mergelist не определено ** Здесь я правильно упомянул mergelist и передал те же аргументы, но все же он показывает NameError, я не могу понять, где я ошибаюсь **
class node:
def __init__(self, data):
self.data=data
self.head=None
class linkedlist:
def __init__(self):
self.head=None
def push(self, newdata):
newnode=node(newdata)
newnode.next=self.head
self.head=newnode
def mergelist(self, l1, l2):
dummy=listnode(0)
pointer=dummy
while(l1 and l2):
if l1.data<=l2.data:
pointer.next=l1
l1=l1.next
else:
pointer.next=l2
l2=l2.next
pointer=pointer.next
if l1 == None:
pointer.next = l2
else:
pointer.next = l1
return dummy.next
def printlist(self):
temp=self.head
while(temp):
print(temp.data)
temp=temp.next
llist1=linkedlist()
llist1.push(4)
llist1.push(9)
llist1.push(7)
llist1.push(5)
llist1.push(4)
llist2=linkedlist()
llist2.push(32)
llist2.push(12)
llist2.push(1)
llist2.push(2)
llist2.push(8)
llist1.printlist()
llist2.printlist()
llist3=linkedlist()
llist3.head=mergelist(llist1.head, llist2.head)
llist3.printlist()
Это ошибка, которую я получаю





Вы вызываете mergelist как глобальную функцию, подобную этой llist3.head=mergelist(llist1.head, llist2.head), когда она фактически определена внутри класса, а точнее класса linkedlist. Один из вариантов - вынести mergelist наружу вот так.
class node:
def __init__(self, data):
self.data=data
self.head=None
class linkedlist:
def __init__(self):
self.head=None
def push(self, newdata):
newnode=node(newdata)
newnode.next=self.head
self.head=newnode
def printlist(self):
temp=self.head
while(temp):
print(temp.data)
temp=temp.next
def mergelist(l1, l2):
dummy=listnode(0)
pointer=dummy
while(l1 and l2):
if l1.data<=l2.data:
pointer.next=l1
l1=l1.next
else:
pointer.next=l2
l2=l2.next
pointer=pointer.next
if l1 == None:
pointer.next = l2
else:
pointer.next = l1
llist1=linkedlist()
llist1.push(4)
llist1.push(9)
llist1.push(7)
llist1.push(5)
llist1.push(4)
llist2=linkedlist()
llist2.push(32)
llist2.push(12)
llist2.push(1)
llist2.push(2)
llist2.push(8)
llist1.printlist()
llist2.printlist()
llist3=linkedlist()
llist3.head=mergelist(llist1.head, llist2.head)
llist3.printlist()
Конечно, теперь у вас есть новые ошибки, такие как listnode, который не определяется. Но я полагаю, вы знаете, как их определить.
Другой вариант - вызвать mergelist, добавив к нему префикс объекта linkedlist и оператора ..
mergelist находится в классе linkedlist, поэтому вам придется называть его так:
llist3.head = linkedlist.mergelist(llist1.head, llist2.head)
Кроме того, поскольку mergelist на самом деле не использует self, вы можете украсить его как @staticmethod и не допускать, чтобы он принимал self в качестве первого аргумента, или вы можете просто вынуть его из класса linkedlist, как в ответе Шрини