📌  相关文章
📜  将链表表示的两个数字相加 |设置 1(1)

📅  最后修改于: 2023-12-03 15:39:20.607000             🧑  作者: Mango

将链表表示的两个数字相加 |设置 1

在做算法题时,常会遇到需要对链表进行加、减、乘或处理的情况。其中,将两个链表表示的数字相加是比较常见的操作之一。

问题描述

给你两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部,而最高位排在链表尾部。求出两个数的和,并将其返回成链表形式。

例如,链表1表示数字 231,链表2表示数字 894,则返回链表表示的数字 1125。

解题思路

链表的每个节点均包含一个数位。为了方便加法运算,需按位相加,并处理进位的情况。

具体来说,可以创建一条新的链表,依次遍历两条原链表,将对应的数位相加后加上前一次的进位数,判断是否需要进位,进位则取模,否则不做处理。直至两个原链表均遍历完,且无进位,才完成了相加运算。

可以参考下面的动图解释:

加法动图示例

需要特别注意的是:若其中一条链表数位较短,那么在遍历到该链表答案和需要处理进位时,需处理「缺失数位」带来的影响。

代码实现

下面给出一个 Java 实现的代码片段。为方便理解,在具体代码中加入了详细的注释。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 创建一个新链表,用于存储相加后的结果
        ListNode dummyHead = new ListNode(0);
        // 指针 p 用于遍历新链表
        ListNode p = dummyHead;
        // 定义变量 carry,用于存储进位情况,并初始化为 0
        int carry = 0;
        // 根据题目描述,l1 和 l2 均为非空链表。因此链表遍历条件只需判断对应节点是否存在
        while (l1 != null || l2 != null) {
            int x = l1 != null ? l1.val : 0;
            int y = l2 != null ? l2.val : 0;
            int sum = x + y + carry;
            carry = sum / 10; // 处理进位
            p.next = new ListNode(sum % 10); // 计算对应位相加的结果,并将当前节点插入新链表
            p = p.next; // 指针后移,遍历下一位
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }
        if (carry > 0) {
            p.next = new ListNode(carry); // 若最后仍有进位,将其加入新链表
        }
        return dummyHead.next; // 返回新链表中不包含头节点的部分
    }
}

在 Java 中,每个链表节点都包含一个整型数值值 val 和一个指向下一个链表节点的指针 next。因此,需要首先定义一个链表节点类,再开始实现相加函数。这段代码中,链表节点类的定义部分并未给出(也就是注释的第 2、3 行),因为对于不同的题目场景,链表节点的定义可能有所不同。但是在题目描述中均会明确给出。

参考资料

如果你对链表的相关操作感到比较陌生,可参考下面这些资料,进行相关知识的学习:

以上是对 「将链表表示的两个数字相加 |设置 1」这道题目的一个讲解。希望对读者有所帮助。