LeetCode-2 AddTwoNumbers | 两数相加
1. 题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2. 题目分析
通过题意可以分析得出:
- 题目给出两个非空的链表,这道题涉及到链表操作
- 每个节点分别代表了一个数字且数字是以逆序的方式存储的,如:数字891在链表中存储为1->9->8
- 题目需要将以逆序存储的数字相加后得出新的逆序存储的链表返回
我们通过链表分别存储每一位数字可以很容易的想到列竖式计算加法,只需要将链表中的每个节点相加即可,且竖式计算中先从低位开始加,链表的逆序存储刚好满足这个条件,我们只需要对两个链表进行遍历相加即可得出答案。
3.代码
public class Solution {
/**
* 解题思路列竖式计算,如果相加和大于10,则进一位
* @param l1
* @param l2
* @return
*/
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode newHead = new ListNode(0);
ListNode curr = newHead;
int out = 0;
while(l1 != null || l2 != null){
int x;
int y;
if(l1 != null){
x = l1.val;
}else{
x = 0;
}
if(l2 != null){
y = l2.val;
}else{
y = 0;
}
int sum = out + x + y;
out = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(out > 0){
curr.next = new ListNode(out);
}
return newHead.next;
}
}