Leetcode 2. 两数相加
题目描述
两个非空链表用来表示两个非负的整数。其中,它们各自的位数按照逆序方式存储的,且每个节点只能存储一位数字。要求返回一个新的链表表示它们的和。示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8 原因:342 + 465 = 807
思路补充:
考虑链表的头节点问题,以及如何用新的链表表示它们的和:设置两个节点,一个作为头节点pre,另一个为实际操作节点cur,在实际操作节点cur中添加指向链表末尾的节点的指针,结束后返回pre->next。
进位问题:中间位:设置值来记录是否要进位;最高位:在当前链表后再加一个值为1的节点
解决方法
1. 按照21题的思路解题
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None:
return l2
if l2 is None:
return l1
pre = ListNode(0)
cur = pre
flag = 0
while l1 or l2:
sum1 = sum2 = 0
if l1:
sum1 = l1.val
l1 = l1.next
if l2:
sum1 += l2.val
l2 = l2.next
sum2 = sum1 + flag
flag = sum2//10
ge = sum2%10
cur.next = ListNode(ge)
cur = cur.next
if flag:
cur.next = ListNode(1)
cur = pre.next
del pre
return cur #提交正确
注:上述解答中红色返回值部分若直接使用return pre.next,在提交代码时例子为[0]、[7,3]会报错,神奇的是本地运行确没有报错,查资料后补充原因。。。
2. 简练方法(来源题解)
其中cur.next是最后一个节点,pre.next指链表开头。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
pre = ListNode(0) #头节点
cur = pre #临时头节点
carry = 0 #进位标志0或1
while (l1 or l2):
sum1 = l1.val if l1 else 0 #若数值不存在填0
sum2 = l2.val if l2 else 0
sums = sum1 + sum2 +carry
carry = sums//10
p = sums%10 #个位数
cur.next = ListNode(p) #更新当前节点,即节点后移
if l1:
l1 = l1.next
if l2:
l2 = l2.next
cur = cur.next
if carry: #考虑最高位进位情况
cur.next = ListNode(carry);# 若进位cur的下一节点设为1
return pre.next # 返回头节点
3. main函数定义
if __name__ == "__main__": t1 = ListNode(0) b1 = ListNode(7) b2 = ListNode(3) b2.next = b1 result = Solution() add_sum = result.addTwoNumbers(t1, b2) while (add_sum != None): print (add_sum.val) add_sum = add_sum.next