leetcode——两数相加(java)

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

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

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

leetcode——两数相加(java)_第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.经过分析得出我们可以使用迭代法来进行解题,首先我们需要写一个辅助函数。

2.而这个辅助函数分别有三个参数,链表1、链表2和进位:carry。

3.如果这时候我们的链表1与链表2的当前节点均是null时,我们要检查一下carry是否不为0,是则建立一个值为carry的链表,否则返回null。

4.当只有其中一个链表为null时,我们需要判断是否为l1,因为,l1是我们的结果链表,是的话,我们需要交换两个链表,方便后面的计算逻辑。

5.开始计算总和,将进位与两个链表的值全部加起来。

6.这时候l1的值赋值为总和对10进行取余。

7.这时候l1链表指向递归的结果,将每一次递归过程的总和存进链表节点中。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return addTwo(l1, l2, 0);
    }
    private ListNode addTwo(ListNode l1, ListNode l2, int carry) {
        if (l1 == null && l2 == null) {
            return carry != 0 ? new ListNode(carry) : null;
        }
        if (l1 == null) {
            l1 = l2;
            l2 = null;
        }
        int sum = carry + l1.val + (l2 != null ? l2.val : 0);
        l1.val = sum % 10;
        l1.next = addTwo(l1.next, (l2 != null ? l2.next : null), sum / 10);
        return l1;
    }
}

你可能感兴趣的:(leetcode,java,算法)