LeetCode 2.两数相加:如何避免结果链表末尾生成多余0节点
问题解答
多余尾0节点修复
问题根源是每次计算完当前位的数值后,都无差别提前创建下一个节点,即使已经没有后续位需要计算,所以最后必然会多出来一个冗余的0节点。
最推荐的修复方案是改用链表题通用的哑节点写法,完全避免提前创建多余节点,逻辑更规范也不容易出问题:
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def addTwoNumbers(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: # 哑节点,不存有效值,仅用来挂载结果链表 total_head = ListNode() total = total_head carry = 0 while list1 or list2: if not list1: digit_sum = carry + list2.val list2 = list2.next elif not list2: digit_sum = carry + list1.val list1 = list1.next else: digit_sum = carry + list1.val + list2.val list1 = list1.next list2 = list2.next # 计算出当前位结果后再新建节点,不会无意义多建 total.next = ListNode(digit_sum % 10) carry = digit_sum // 10 total = total.next # 有进位才新增节点,不需要就不创建 if carry > 0: total.next = ListNode(carry) # 跳过哑节点返回实际结果头 return total_head.next
如果不想大幅改动原有代码,也可以在循环结束后做兜底处理:先遍历到结果链表的倒数第二个节点,将它的next设为None即可删掉末尾冗余的0节点,但这种方案如果遇到最后有进位的场景还要额外处理兼容,不如哑节点方案省心。
传入链表指针的疑问解答
完全不需要担心上层作用域的链表被修改。Python的参数传递是对象引用的副本传递,你在函数内修改的是list1、list2这两个局部变量的指向,并没有修改原链表节点本身的结构,也不会修改上层作用域中存储的链表头指针的指向,函数执行结束后上层的两个原始链表还是完整的,头指针也不会变成None。
内容的提问来源于stack exchange,提问作者heretoinfinity
相关产品推荐
相关产品推荐

