LeetCode 2. 两数相加 LeetCode 2. 两数相加题目难度中等题型分类链表、数学、模拟题目链接两数相加给定两个非空链表l1和l2分别表示两个非负整数。每个节点存储一位数字数字按照逆序排列即头节点表示个位。计算两个整数之和并以相同的逆序链表形式返回结果。除数字0外输入所表示的整数均不含前导零。示例输入l1 [2,4,3], l2 [5,6,4] 输出[7,0,8] 解释342 465 807。 输入l1 [0], l2 [0] 输出[0] 输入l1 [9,9,9,9,9,9,9], l2 [9,9,9,9] 输出[8,9,9,9,0,0,0,1]数据范围每个链表包含1到100个节点。0 Node.val 9输入所表示的整数不含前导零。解题思路模拟竖式加法。由于链表逆序存储可以从头节点开始逐位相加。用add保存进位每轮累加两个链表当前节点的值。add % 10是当前位的结果add / 10的整数部分是下一位的进位。某个链表遍历结束后该链表后续位按0处理。只有后面还有节点或进位时才创建下一个结果节点避免多余节点。注意即使两个链表都已结束只要还有进位就需要继续计算。这里的head是结果链表的第一个有效节点不是虚拟头节点。设两个链表长度分别为m、n时间复杂度O(max(m, n))空间复杂度结果链表占O(max(m, n))不计结果链表时辅助空间为O(1)。JavaclassSolution{publicListNodeaddTwoNumbers(ListNodel1,ListNodel2){intadd0;ListNodeheadnewListNode();ListNodecurhead;while(l1!null||l2!null||add!0){if(l1!null){addl1.val;l1l1.next;}if(l2!null){addl2.val;l2l2.next;}cur.valadd%10;if(l1!null||l2!null||add/10!0){cur.nextnewListNode();curcur.next;}add/10;}returnhead;}}CclassSolution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){ListNode*headnewListNode();ListNode*curhead;intadd0;while(l1||l2||add){if(l1){addl1-val;l1l1-next;}if(l2){addl2-val;l2l2-next;}cur-valadd%10;if(l1||l2||add/10!0){cur-nextnewListNode();curcur-next;}add/10;}returnhead;}};Python 3classSolution:defaddTwoNumbers(self,l1:ListNode|None,l2:ListNode|None)-ListNode|None:headListNode()curhead add0whilel1orl2oradd!0:ifl1:addl1.val l1l1.nextifl2:addl2.val l2l2.nextcur.valadd%10ifl1orl2oradd//10!0:cur.nextListNode()curcur.nextadd//10returnhead三种实现均使用力扣提供的ListNode定义。Python 使用//进行整数除法计算下一位的进位。