LeetCode 两数相加

一:两数相加

      • 题目介绍
      • 解题思路
      • 代码

题目介绍

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

LeetCode 两数相加_第1张图片

解题思路

LeetCode 两数相加_第2张图片
如上图所示,两个链表的数据位数是一致的,所以可以相加。我们可以采用循环两个链表。数据相加,然后存入一个链表,此时我们只需要考虑两数相加超过10进位问题。如果进位的话,进位值为1,加到下一轮数值即可,每次循环后,两个链表都向后移动一位。直到两个值都为空,则说明相加完毕。然后用一个链表存入每个位数的相加值即可,最后需要考虑结果的顺序问题

代码

首先定义一个ListNode。入参和返回值都是这个对象

class ListNode {
    int val;
    ListNode next;

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

具体的业务逻辑:

static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode preNode = new ListNode(0);//定义返回值
        int carry = 0;//定义一个参数,存储 两数和大于10的个位数
        ListNode currentNode = preNode;
        while (l1 != null || l2 != null) {
            //1.如果为null.则说明 不存在,则该位补0
            int node1Value = l1 == null ? 0 : l1.val;
            int node2Value = l2 == null ? 0 : l2.val;

            //2.carry 为上下一位相加 可能超过10的进位数。进位了为1,没有进位,就是0
            int sum = node1Value + node2Value + carry;

            //3.重新计算本轮相加是否进位,如果相加的值(sum)大于9,说明进位(赋值为1),否则不进位(赋值为0)
            carry = sum > 9 ? 1 : 0;

            //4.重新计算sum. 主要是进位的话,sum 要减10, carry 要变为1(上一步已经处理)
            if (sum > 9) {
                sum = sum - 10;
            }

            //5.创建返回值节点,并赋值给当前节点的下一个节点
            currentNode.next = new ListNode(sum);

            //6.继续循环,节点向后移动。即下一次 创建的节点,需要接在 刚刚新创建的节点下面。
            currentNode = currentNode.next;

            //7.入参 l1和l2 进行后移,继续循环
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        //8. 如果当前循环是最后一次,那么 节点的最后一个是1.把这部分逻辑移到循环外
        if (carry == 1) {
            currentNode.next = new ListNode(carry);
        }

        return preNode.next;
    }

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