题目链接
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
如果不等长的话,我们就在短的那个链表上补0
l1: 2 -> 4 -> 3
l2: 5
计算的结果相当于是:243 + 005 = 248
l1: 2
l2: 5 -> 6 -> 4
我们看似是将两个不等长的链表进行相加,其实是补了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
}
}