2. 两数相加(中)
目录
题目
-
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
python
题解:递归----判断条件是和超出10否
- 仔细理解题意发现,不用逆转链表,刚好可以从两个链表的头开始相加,直接返回相加的结果就是题目的意思。
# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
# 如果其中一个链表为空,直接返回另一个链表
if l1 is None:
return l2
if l2 is None:
return l1
# 将l1和l2对应节点的值相加,赋值给l1节点
l1.val += l2.val
# 如果相加的结果大于等于10,需要进位
if l1.val >= 10:
# 如果l1的下一个节点为空,创建一个新节点,并将其值初始化为0
if l1.next is None:
l1.next = ListNode(0)
# 如果l2的下一个节点为空,创建一个新节点,并将其值初始化为0
if l2.next is None:
l2.next = ListNode(0)
# 进位值1加到l1的下一个节点的值上
l1.next.val += 1
# 递归调用自身处理下一个节点的相加操作
l1.next = self.addTwoNumbers(l1.next, l2.next)
# 对l1节点的值取余,保留十位数上的值
l1.val %= 10
else:
# 递归调用自身处理下一个节点的相加操作
l1.next = self.addTwoNumbers(l1.next, l2.next)
# 返回l1链表,表示相加的结果
return l1
javascript
题解:迭代---判断条件是(l1 || l2 || count>0)
var addTwoNumbers = function(l1, l2) {
let result = new ListNode(0)//新链表
let l3 = result
let count = 0//初始化两数之和超出10的值,将加入下一回合的值
while(l1 || l2 || count>0){//l1没结束或l2没结束或count>0继续循环
let sum = count//将上一轮超出10的数统计到该轮
if( l1){//先加上l1
sum+=l1.val
l1=l1.next
}
if( l2){//再加上l2
sum+=l2.val
l2=l2.next
}
count = Math.floor(sum/10)//记录商数统计到下一回合
l3.next = new ListNode(sum%10)//不管两数之和是否超出10都可以余数表示当前值
l3=l3.next//移动指针
}
return result.next
};
题解:递归---判断条件是(l1 || l2 || count>0)
var addTwoNumbers = function(l1, l2) {
// 辅助函数,执行递归
const addHelper = (node1, node2, carry) => {
// 基础条件:如果两个节点都是 null 且没有进位,返回 null
if (!node1 && !node2 && carry === 0) {
return null;
}
// 计算当前位的和
let sum = carry;
if (node1) {
sum += node1.val; // 加上第一个链表的当前节点值
}
if (node2) {
sum += node2.val; // 加上第二个链表的当前节点值
}
// 计算新的进位
carry = Math.floor(sum / 10);
// 创建一个新节点,值为当前位的结果
const newNode = new ListNode(sum % 10);
// 递归处理下一个节点
newNode.next = addHelper(node1 ? node1.next : null, node2 ? node2.next : null, carry);
return newNode; // 返回新节点
};
return addHelper(l1, l2, 0); // 开始递归,初始进位为 0
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人