力扣经典150题第五十七题:两数相加

简介: 力扣经典150题第五十七题:两数相加

力扣经典150题第五十七题:两数相加

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

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

示例

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]

输出:[0]

示例 3:

输入: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
  • 题目数据保证列表表示的数字不含前导零

解题思路

本题可以通过模拟加法的方式求解,从链表的头节点开始逐位相加,注意进位的处理。具体步骤如下:

  1. 创建一个新的链表 dummyHead 作为结果链表的头节点,并初始化进位 carry 为 0。
  2. 遍历输入的两个链表 l1 和 l2,同时对应位置上的节点进行相加,如果某个链表已经遍历完成,则对应位置上的数字视为 0。
  3. 将两个节点值与进位相加,并更新进位。
  4. 将相加结果的个位数作为新节点的值,并将新节点连接到结果链表的尾部。
  5. 更新指针,继续遍历下一个节点,直到两个链表都遍历完毕。
  6. 如果最后还有进位,则在结果链表的尾部添加一个值为进位值的新节点。
  7. 返回结果链表的头节点。

以下是 Java 代码示例:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}
public class AddTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, curr = dummyHead;
        int carry = 0;
        while (p != null || q != null) {
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }
    public static void main(String[] args) {
        AddTwoNumbers solution = new AddTwoNumbers();
        // 创建示例链表
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);
        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);
        // 测试示例
        ListNode result = solution.addTwoNumbers(l1, l2);
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
        // 输出:7 0 8
    }
}
该代码通过模拟加法的方式,从链表的头节点开始逐位相加,具有时间复杂度 O(max(m, n)) 和空间复杂度 O(max(m, n)) 的特性。
相关文章
|
前端开发 fastjson Java
我的字段被FastJson给干掉了?!
本文记录作者升级到 JDK 11 后遇到的 FastJSON 序列化问题,以及详细的排查过程。
412 12
|
网络协议 网络虚拟化
eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP
eNSP模拟无线AC和AP 1、拓扑 2、需求(实现AC和AP二层关联) 3、配置(dhcp enable; interface Vlanif 1; ip address 192.
7714 0
|
IDE 开发工具
Devres - 管理设备资源 【ChatGPT】
Devres - 管理设备资源 【ChatGPT】
|
存储 Ubuntu Linux
linux系统中如何制作rootfs?详细教程
linux系统中如何制作rootfs?详细教程
502 0
|
Linux Shell 数据库
编程入门(六)【Linux系统基础操作二】
编程入门(六)【Linux系统基础操作二】
150 0
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
137 0
|
Python
python用thinker库制作一个进制转换器(可打包exe)
进制转换之间很麻烦,还得计算,如果可以做一个进制转换器多nice,其实也不难,就利用一个tkinter库就能制作,废话不多说,直接开搞。
687 0
python用thinker库制作一个进制转换器(可打包exe)
|
SQL 前端开发 JavaScript
ElementUI之动态树+数据表格+分页
ElementUI之动态树+数据表格+分页
155 0
|
存储 设计模式 算法
【数据结构】ArrayList和顺序表
【数据结构】ArrayList和顺序表
108 0
|
存储 安全 关系型数据库
插件未购买或已到期,请重新绑定帐号后重试,如操作无效,请将服务器出口IP改为:8XX.XXX.XX.XX
插件未购买或已到期,请重新绑定帐号后重试,如操作无效,请将服务器出口IP改为:8XX.XXX.XX.XX
1023 0