LeetCode随缘刷题之两数相加

逐步解释,有说错的地方欢迎指正。

package leetcode.day_12_03;

/**
 * 给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
 * <p>
 * 请你将两个数相加,并以相同形式返回一个表示和的链表。
 * <p>
 * 你可以假设除了数字 0 之外,这两个数都不会以 0开头。
 * <p>
 * 示例 1:
 * <p>
 * 输入:l1 = [2,4,3], l2 = [5,6,4]
 * 输出:[7,0,8]
 * 解释:342 + 465 = 807.
 * 示例 2:
 * <p>
 * 输入:l1 = [0], l2 = [0]
 * 输出:[0]
 * 示例 3:
 * <p>
 * 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 * 输出:[8,9,9,9,0,0,0,1]
 *
 * @author soberw
 */
public class AddTwoNumbers0002 {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //创建一个空的链表,指定一个头指针,可以是任何数,空着也行,这里我写的0
        ListNode ahead = new ListNode(0);
        //将用于存放链表的数据,我们都知道这里的赋值是复制的地址值,所以他们其实指向同一个地址
        ListNode current = ahead;
        //用于存放十位(即如果7+8=15  carry就是存放十位的1的)
        int carry = 0;
        //循环的终止条件是如果两个参数链表都为空
        while (l1 != null || l2 != null) {
            //创建两个变量分别存放值,如果已经走到头了就赋值为0
            int x = l1 != null ? l1.val : 0;
            int y = l2 != null ? l2.val : 0;
            //计算和,这里加上carry可能不好理解,其实就是简单的数学知识,个位数上的10在十位数上就是1
            //就是说在个位数加上10,相当于在十位数加上1
            int sum = x + y + carry;
            //转换为十位数
            carry = sum / 10;
            //存放在预定的链表中(注意格式)
            current.next = new ListNode(sum % 10);
            //链表向后走,指向下一个空指针
            current = current.next;
            //如果后面还有元素就向后走
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        //最后剩余的一位不能漏
        if (carry != 0) {
            current.next = new ListNode(carry);
        }
        //要知道头结点从来都没变过,我们变得只是current的指向,所以我们返回头结点的next就行了
        return ahead.next;
    }

}


class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

测试通过结果:
在这里插入图片描述

posted @ 2022-02-09 19:45  soberw-  阅读(30)  评论(0编辑  收藏  举报