如何打印链表题返回的ListNode类对象(LeetCode合并两个有序链表场景)
合并有序链表VSCode本地调试问题解决
背景
由于LeetCode不对免费用户开放调试器功能,希望在VSCode中模拟LeetCode的测试用例,对应题目为合并两个有序链表。
原始代码
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def add_nodes(self, parent, vals): while len(vals) > 0: node = ListNode(vals[0]) parent.next = node return self.add_nodes(node, vals[1:]) class Solution: def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode: l1 = [] while list1 != None: l1.append(list1.val) list1 = list1.next while list2 != None: l1.append(list2.val) list2 = list2.next l1.sort() if l1 == []: return None new_list = ListNode(l1[0]) new_list.add_nodes(new_list, l1[1:]) return new_list # 原始测试代码(存在问题) program = Solution() list = program.mergeTwoLists(ListNode([1, 3, 4]), ListNode([1, 2, 4])) print(list.__dict__)
预期效果
两个测试链表[1,2,4]和[1,3,4]合并后,打印输出为[1,1,2,3,4,4]。
存在问题
- 测试链表构造错误:直接向
ListNode构造函数传入列表[1,3,4],只会将整个列表赋值给首节点的val属性,不会生成多节点的链式结构,这也是实际输出里val为[1,2,4]的原因。 - 缺少链表遍历逻辑:
print(list.__dict__)只能打印当前节点的属性,无法递归遍历所有后续节点输出完整值列表。
修复方案
步骤1:给ListNode添加打印魔术方法
在ListNode类中新增__repr__方法,打印节点时自动遍历整个链表输出为列表格式:
def __repr__(self): res = [] cur = self while cur: res.append(cur.val) cur = cur.next return str(res)
步骤2:修正测试链表构造方式
两种正确构造测试链表的方法二选一即可:
- 链式直接构造:
list1 = ListNode(1, ListNode(3, ListNode(4))) list2 = ListNode(1, ListNode(2, ListNode(4)))
- 用已有的
add_nodes方法构造:
list1 = ListNode(1) list1.add_nodes(list1, [3,4]) list2 = ListNode(1) list2.add_nodes(list2, [2,4])
完整修复后代码
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def add_nodes(self, parent, vals): while len(vals) > 0: node = ListNode(vals[0]) parent.next = node return self.add_nodes(node, vals[1:]) # 新增打印方法 def __repr__(self): res = [] cur = self while cur: res.append(cur.val) cur = cur.next return str(res) class Solution: def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode: l1 = [] while list1 != None: l1.append(list1.val) list1 = list1.next while list2 != None: l1.append(list2.val) list2 = list2.next l1.sort() if l1 == []: return None new_list = ListNode(l1[0]) new_list.add_nodes(new_list, l1[1:]) return new_list # 修正后的测试代码 program = Solution() list1 = ListNode(1, ListNode(3, ListNode(4))) list2 = ListNode(1, ListNode(2, ListNode(4))) result = program.mergeTwoLists(list1, list2) print(result)
运行后即可得到预期输出[1, 1, 2, 3, 4, 4]。
内容的提问来源于stack exchange,提问作者gigaSecure
相关产品推荐
相关产品推荐

