题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字0之外,这两个数都不会以0开头。
示例
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
思路
- 定义一个头结点,以及l1、l2、头结点的临时结点,定义一个变量存放进位
- 遍历两个临时链表,终止条件为两个临时链表的当前节点都为空
- 求出进位和两个链表当前位置的和,和10相除作为下一次进位,和10取余作为新节点,头结点临时结点下一个为此新节点
- 头结点、两个链表临时结点都取下一个,直到遍历结束
- 遍历结束,判断进位值是不是0,如果比0大,则表示还有进位,此进位作头结点临时结点的下一位
- 最后返回头结点的下一个
Code
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (Objects.isNull(l1) && Objects.isNull(l2)) {
return null;
}
ListNode head = new ListNode(0);
ListNode l1Temp = l1;
ListNode l2Temp = l2;
ListNode headTemp = head;
int num = 0;
while (l1Temp != null || l2Temp != null) {
int sum = num + (Objects.nonNull(l1Temp) ? l1Temp.getVal() : 0) + (Objects.nonNull(l2Temp) ? l2Temp.getVal() : 0);
num = sum / 10;
headTemp.setNext(new ListNode(sum % 10));
headTemp = headTemp.getNext();
l1Temp = Objects.nonNull(l1Temp) ? l1Temp.getNext() : null;
l2Temp = Objects.nonNull(l2Temp) ? l2Temp.getNext() : null;
}
if (num > 0) {
headTemp.setNext(new ListNode(num));
}
return head.getNext();
}
}