2.两数相加(Java+python题解)

本文介绍了如何使用Java和Python实现将两个逆序存储的链表表示的非负整数相加,通过设置指针处理进位,并保持链表结构。同时分析了时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 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
题目数据保证列表表示的数字不含前导零

Problem: 2. 两数相加

思路

首先这道题是利用两个单链表进行操作,排除各种特殊情况,只需要设置两个指针,l1和l2,分别指向输入的两个单链表,通过将l1.val+l2.val的值赋值给一个新的结点,之后将节点连接起来便解决了。其中特殊情况有:
①l1.val+l2.val会大于10,此时要保存对10取余的结果到新节点上;并且设置一个进位变量jin,每次的求和改为l1.val+l2.val+jin;jin变量在每次求和判断不大于10的时候就要赋值为0,相反则赋值为1。
②每个节点连接起来,这个时候需要两个节点lq和lb,lq表示上个节点,lb表示当前节点,在把计算结果赋值到lb中后,让lq指向lb,之后再让lq=lb这样通过循环就能连接起来了。
③l1和l2的长度不确定,可能出现其中一个遍历结束了,但是另一个还没有结束,所有在之前的求和式子中改为(l1!=null ? l1.val:0)+(l2!=null ? l2.val:0)+jin,这样可以是遍历结束的链表后续元素当作0来处理。

复杂度

  • 时间复杂度:

添加时间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))

  • 空间复杂度:

添加空间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))

Code(Java)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3=new ListNode();//头节点
        ListNode lh=new ListNode();//前节点
        int jin=0;//判断进位
        lh=l3;
        while(l1!=null || l2!=null){
            ListNode lb=new ListNode();//后节点
            int temp=(l1!=null ? l1.val:0)+(l2!=null ? l2.val:0)+jin;
            jin=temp/10;
            temp%=10;
            lb.val=temp;
            lh.next=lb;
            lh=lb;
            l1=(l1!=null? l1.next:null);
            l2=(l2!=null? l2.next:null);
        }
        if(jin==1) lh.next=new ListNode(1);
        return l3.next;
    }
}

Code(python)

代码未优化


# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        l3=ListNode()
        now=l1.val+l2.val
        jin=0
        if now>=10:
            jin=1
            now=now%10
        l3.val=now
        lq=ListNode()
        lq=l3
        t1=l1.next
        t2=l2.next
        while (t1!=None and t2!=None):

            lb=ListNode()

            t3=t1.val+t2.val+jin
            if t3>=10:
                t3=t3-10
                jin=1
            else:
                jin=0
            
            lb.val=t3

            lq.next=lb
            lq=lb

            t1=t1.next
            t2=t2.next

        con=None
        if t1!=None or t2!=None:
            if t1!=None:
                con=t1
            elif t2!=None:
                con=t2
        
        while (con!=None):
            
            lb=ListNode()

            t3=con.val+jin
            if t3>=10:
                t3=t3%10
                jin=1
            else:
                jin=0
            
            lb.val=t3

            lq.next=lb
            lq=lb

            con=con.next
        
        if jin==1:
            lb=ListNode()
            lb.val=1
            lq.next=lb
            lq=lb
        return l3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值