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
};
posted @   Frommoon  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示