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

📅  最后修改于: 2023-12-03 14:53:55.469000             🧑  作者: Mango

将链表表示的两个数字相加

在链表中,每个节点代表一个数字的一位。现在我们想将两个链表表示的数字相加,并返回一个新的链表表示其和。

思路

这道题目的思路主要是模拟数字相加的过程,需要注意进位的情况。具体的思路如下:

  1. 我们首先从两个链表的头节点开始遍历,初始化进位数为0。
  2. 对于每一位,我们都将两个链表对应位置的数字相加,同时加上进位数。
  3. 如果和大于10,则需要进位。具体做法是将和减去10,并将进位数置为1。
  4. 将当前位(可能需要进位后的结果)插入到结果链表中,并将指针向后移动。
  5. 继续进行下一位的计算,直到我们遍历完了两个链表的所有节点。
  6. 如果最后还有进位,则需要在结果链表末尾再插入一个节点。
代码实现

下面是Java的代码实现,注释中详细解释了每一步的思路:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    // 初始化指针、进位数和结果链表
    ListNode p1 = l1, p2 = l2;
    int carry = 0;
    ListNode dummyNode = new ListNode(-1);
    ListNode p = dummyNode;
    
    // 遍历两个链表,将每一位上的数字相加,并将结果插入到结果链表中
    while (p1 != null || p2 != null) {
        int num1 = p1 == null ? 0 : p1.val;
        int num2 = p2 == null ? 0 : p2.val;
        int sum = num1 + num2 + carry;
        carry = sum >= 10 ? 1 : 0;
        p.next = new ListNode(sum % 10);
        p = p.next;
        if (p1 != null) p1 = p1.next;
        if (p2 != null) p2 = p2.next;
    }
    
    // 处理最后的进位
    if (carry > 0) {
        p.next = new ListNode(carry);
    }
    
    // 返回结果链表
    return dummyNode.next;
}
总结

这道题目通过模拟相加的过程,用链表来表示结果,提供了一种解决数字相加问题的有效方案。需要注意的是,需要处理进位的情况,并注意处理完最后一位后是否需要再处理一次进位的情况。