LeetCode_2. 两数相加
题目
思路
1. 模拟法
- 思路分析
对于链表 l1 和 l2 ,将共同都有的部分相加,构造结果链表,之后取某个较长链表的剩余部分构造结果链表。
需要注意的是,对进位的处理。
代码实现
# 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, l1: ListNode, l2: ListNode) -> ListNode:
res=ListNode() # 该节点仅仅作为链表头使用,方便批量迭代处理
t=res # 可以移动的节点指针
carry=0 # 保存进位
while l1 is not None and l2 is not None:
value=l1.val+l2.val+carry
carry=0 # 加完进位之后将carry重置为0
if value>=10: # 判断加和是否大于等于10
carry=1
value=value-10
# 申请新的节点,并赋值
t.next=ListNode()
t=t.next
t.val=value
# 更新l1和l2指针
l1=l1.next
l2=l2.next
while l1 is None and l2 is not None:
t.next=ListNode()
t=t.next
value=l2.val+carry
carry=0
if value>=10:
carry=1
value=value-10
t.val=value
l2=l2.next
while l2 is None and l1 is not None:
t.next=ListNode()
t=t.next
value=l1.val+carry
carry=0
if value>=10:
carry=1
value=value-10
t.val=value
l1=l1.next
if carry==1:# 最后检测是否还有进位
t.next=ListNode()
t=t.next
t.val=1
return res.next
代码精简的结果
思想在于视为在较短的链表后面逻辑上补 0,从而方便处理。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
res=ListNode()
t=res
carry=0
while l1 or l2:
if l1:
val1=l1.val
l1=l1.next
else:
val1=0
if l2:
val2=l2.val
l2=l2.next
else:
val2=0
value=val1+val2+carry
t.next=ListNode(value%10)
t=t.next
carry=value//10
if carry>0:
t.next=ListNode(1)
return res.next
https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode-solution/