Leetcode - 2. 两数相加——链表
发布日期:2021-05-07 21:20:12 浏览次数:18 分类:精选文章

本文共 1519 字,大约阅读时间需要 5 分钟。

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。

示例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]

方法思路

该问题要求我们对两个逆序存储的数字链表进行相加。每个链表中的节点存储一个数字,链表的头节点存储最低有效位,末尾节点存储最高有效位。与常规的链表相加不同,这里需要考虑逆序存储的特点。

具体步骤如下:

  • 初始化一个头节点,用于记录最终结果。
  • 使用两个指针分别遍历两个链表,同时处理相加过程。
  • 在当前节点处计算当前位的数字之和,加上可能的进位。
  • 将当前位的和的个位数作为当前节点的值,进位(如果有的话)保留到下一位处理。
  • 移动指针到下一个节点,继续处理下一位。
  • 处理完所有节点后,如果有剩余的进位,添加到结果中。
  • 解决代码

    class Solution_2 {    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {        ListNode pre = new ListNode(0);        ListNode cur = pre;        int flag = 0;        while (l1 != null || l2 != null) {            int x = l1 == null ? 0 : l1.val;            int y = l2 == null ? 0 : l2.val;            int sum = x + y + flag;            flag = sum / 10;            sum = sum % 10;            cur.next = new ListNode(sum);            if (l1 != null) {                l1 = l1.next;            }            if (l2 != null) {                l2 = l2.next;            }            cur = cur.next;        }        if (flag == 1) {            cur.next = new ListNode(flag);        }        return pre.next;    }}

    代码解释

  • 初始化:创建一个新的链表头节点pre,用于记录最终结果,cur指针从pre开始遍历。
  • 循环处理:只要有一个链表的节点未被处理,继续循环。
  • 获取当前位的数字:如果当前链表为空,则取值为0,否则取当前节点的值。
  • 计算和与进位:将当前位的数字相加,加上进位,计算新的进位flag和当前位的值sum
  • 创建新的节点:将当前位的值创建为新的节点并连接到当前链表尾部。
  • 移动指针:根据链表是否为空,移动指针到下一个节点。
  • 处理剩余进位:如果循环结束后还有进位,添加到结果中。
  • 该方法确保了两个逆序存储的数字链表相加的正确性,并且结果以逆序形式返回,符合题目要求。

    上一篇:LeetCode - 3. 无重复字符的最长子串——哈希表、双指针、滑动窗口法、字符串
    下一篇:剑指 Offer 63. 股票的最大利润——动态规划

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月03日 18时44分16秒