力扣经典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)) 的特性。
相关文章
|
4天前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
12 0
|
4天前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
12 0
|
1天前
|
存储 缓存 监控
Memcached介绍和详解
Memcached介绍和详解
13 3
|
1天前
|
JavaScript UED
Vue.js 中的 `v-if`、`v-else-if` 和 `v-else`:条件渲染详解
Vue.js 中的 `v-if`、`v-else-if` 和 `v-else`:条件渲染详解
8 0
|
1天前
|
JavaScript 前端开发 大数据
Vue.js 中的 `v-if` 和 `v-show`:理解与应用
Vue.js 中的 `v-if` 和 `v-show`:理解与应用
7 0
|
4天前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
13 1
|
1天前
|
机器学习/深度学习 数据采集 算法
Scikit-Learn基础教程
Scikit-Learn基础教程
10 2
|
1天前
|
机器学习/深度学习 数据采集 自然语言处理
大语言模型系列:Transformer
大语言模型系列:Transformer
30 0
|
1天前
|
机器学习/深度学习 数据采集 人工智能
深度神经网络:从基础到实践
深度神经网络:从基础到实践
19 2
|
1天前
|
Web App开发 缓存 前端开发
探索WebKit的奥秘:打造高效、兼容的现代网页应用
探索WebKit的奥秘:打造高效、兼容的现代网页应用
13 5