【LeetCode】 2. 两数相加 (JAVA)列竖式补0相加 代码有注释

题目链接

https://leetcode-cn.com/problems/add-two-numbers/

解题思路

其实这道题目本来是没有解出来的,但是代码写了个差不多,但是咋着都不好使,我看他们写的也挺好的,我就写写我的理解把

  • 这道题目其实就是算两个数字相加
  • 要注意的地方有两点(1)相加大于等于10要进位;(2)l1和l2长度不一样
  • 要熟悉两个数相加怎样列竖式,缺位补0

其实这两点我都想到了,但是我还是没写出来,所以不得不去题解区看了看别人家的代码。。。

列竖式

如果两个链表长度相等,我们拿题目给的例子

l1: 2 -> 4 -> 3
l2: 5 -> 6 -> 4

计算的结果相当于是:342 + 465 = 708
image.png

如果不等长的话,我们就在短的那个链表上补0

l1: 2 -> 4 -> 3
l2: 5

计算的结果相当于是:243 + 005 = 248
image.png


l1: 2
l2: 5 -> 6 -> 4
image.png

我们看似是将两个不等长的链表进行相加,其实是补了0来进行运算

代码

/**
 * 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 res = new ListNode(0);                 // 声明结果ListNode
        ListNode restemp = res;                         // 声明临时来进行操作
        int temp = 0;                                   // 用来标识是否进位,只有0或者1两个可能

        while (l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.val;            // x或者y如果为空的话就补零
            int y = l2 == null ? 0 : l2.val;

            int sum = x + y + temp;                    // 计算两个数字相加的值,加上之前的进位
            temp = sum / 10;                           // 取商,看是否需要进位
            sum = sum % 10;                            // 取余

            restemp.next = new ListNode(sum);          // 将我们计算的值作为新节点放在restemp的下一个上
            restemp = restemp.next;                    // 将restemp的下一个作为新的节点
            if (l1 != null) l1 = l1.next;              // 如果l1和l2不为空的话就指向下一个,如果到头了就会变成null,null的话就不会再指向下一个了
            if (l2 != null) l2 = l2.next;
        }
        if (temp == 1) restemp.next = new ListNode(temp); // 最后如果有进位的话再添加一个节点
        return res.next;          // 为了方便循环,所以在声明时设置了res的第一个值为0(其实这个没用),第二个值才是第一个,所以时res.next
    }
}
发布了129 篇原创文章 · 获赞 147 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq1515312832/article/details/103580472