【LeetCode】【Java】两数相加
1️⃣题目
首先要读题,我已经在读题上栽了许多次了。
题目首先给出了几个关键条件,“非空链表”、“表示两个非负整数”、“逆序存储”、每个结点存储一位“、”两数相加“,其中比较关键的信息是逆序存储,为什么要用逆序存储呢?题目最终让求两数相加,我们平时在进行加法运算时,都是从个位开始,满10进1,那么题目说逆序存储,那么我们相加后,进位是可以很方便的加到下一位上,这样也符合链表的顺序,便于求解,否则我们还要将两个链表反转再相加。
2️⃣思路
明白题意,思路其实很简单,就是利用链表的特性进行求解,我们可以用循环来遍历两个链表,当其中一个链表不为null时,我们就可以求和,把求到的结果存到新的链表中,最后返回链表的头结点即可。
具体看代码注释
3️⃣代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res = new ListNode();
ListNode head = res;
int carry = 0; //进位值
while (l1!=null || l2!=null) {
int sum = 0;
//l1不为null,把当前值加上
if (l1!=null) {
sum += l1.val;
l1 = l1.next;
}
if (l2!=null) {
sum += l2.val;
l2 = l2.next;
}
//先求和,再更新进位值,运行次序不能边
sum = sum + carry;
//更新下一个进位数
carry = sum / 10;
//确保val在0-9
sum = sum % 10;
//求值结果放入下一个结点中,最终求得的结点比原先多一个,所以返回结果从头结点的下一结点开始。
head.next = new ListNode(sum);
head = head.next;
}
//确保最后一位进位值(非0)可以加入新链表
if(carry == 1){
head.next = new ListNode(carry);
}
//返回链表的下一个元素,因为起始元素没有保存结果
return res.next;
}
}