LeetCode_2. 两数相加
题目

思路
1. 模拟法
- 思路分析
对于链表 l1 和 l2 ,将共同都有的部分相加,构造结果链表,之后取某个较长链表的剩余部分构造结果链表。
需要注意的是,对进位的处理。
代码实现
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass 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+carrycarry=0 # 加完进位之后将carry重置为0if value>=10: # 判断加和是否大于等于10carry=1value=value-10# 申请新的节点,并赋值t.next=ListNode()t=t.nextt.val=value# 更新l1和l2指针l1=l1.nextl2=l2.nextwhile l1 is None and l2 is not None:t.next=ListNode()t=t.nextvalue=l2.val+carrycarry=0if value>=10:carry=1value=value-10t.val=valuel2=l2.nextwhile l2 is None and l1 is not None:t.next=ListNode()t=t.nextvalue=l1.val+carrycarry=0if value>=10:carry=1value=value-10t.val=valuel1=l1.nextif carry==1:# 最后检测是否还有进位t.next=ListNode()t=t.nextt.val=1return res.next
代码精简的结果
思想在于视为在较短的链表后面逻辑上补 0,从而方便处理。
class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:res=ListNode()t=rescarry=0while l1 or l2:if l1:val1=l1.vall1=l1.nextelse:val1=0if l2:val2=l2.vall2=l2.nextelse:val2=0value=val1+val2+carryt.next=ListNode(value%10)t=t.nextcarry=value//10if 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/
