力扣的两数相加解法
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
# 如果有一个链表为空,返回另外一个
if line1 is None:
return line2
if line2 is None:
return line1
# temp是暂时存(temporal)
temp = ListNode(0) # 引用ListNode类定义了一个链表节点并赋给tmp
# reset是重置(reset)
reset = temp # 进行赋值
# flag 标示
flag = 0 # 初始化
while line1 or line2: # line1或line2不为空就继续执行
temp_sum = 0 # 链表节点值的和
if line1: # 如果line1不为空,把line1的某个节点值的和赋给temp_sum
temp_sum = line1.val # 把line1的某个节点的值赋给temp_sum
line1 = line1.next
if line2: # 如果line2不为空,把line2中和line1对应的节点的值加到tmp_sum
temp_sum += line2.val
line2 = line2.next # 指向下一个节点,为下一次的加和做准备
temp_res = ((temp_sum + flag) % 10) # 个位数字
flag = ((temp_sum + flag) // 10) # 进位的数
reset.next = ListNode(temp_res)
reset = reset.next # reset后移
if flag: # 如果flag不为0,就是对应位置相加后有进位
reset.next = ListNode(1) # reset的下一节点设为1
reset = temp.next # 赋值
del temp # 删除temp变量
return reset # 返回reset链表
运行结果1:
参考程序2:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
carry = 0
head = ListNode(0)
reset = head
while line1 or line2:
num1 = line1.val if line1 else 0
num2 = line2.val if line2 else 0
temp = num1 + num2 + carry
carry = 1 if temp >= 10 else 0
head.next = ListNode(temp % 10)
head = head.next
if line1:
line1 = line1.next
if line2:
line2 = line2.next
if carry:
head.next = ListNode(1)
return reset.next
运行结果2:
参考程序3:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
carry = 0
temp = 0
line3 = ListNode(0)
reset = line3
while line1 is not None or line2 is not None or carry > 0:
temp = carry
if line1 is not None:
temp += line1.val
line1 = line1.next
if line2 is not None:
temp += line2.val
line2 = line2.next
node = ListNode(temp % 10)
line3.next = node
line3 = line3.next
carry = temp // 10
return reset.next
运行结果3: