You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
感觉这种思维方式真的很妙。通过一个carry来得到进位数,通过一个sum来算和。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1); // 创建一个哨兵节点
ListNode head = prehead; // 创建一个指针
int carry = 0; // 存储进位数
while(l1 != null || l2 != null){ // 只有两个链表都为空的时候才会结束循环
int x = l1 == null ? 0 : l1.val; // 如果本链表已经为空了,就返回0,否则返回当前节点的值
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry; // 计算一下当前x + y的值,再加上进位值.
carry = sum / 10; // 计算一下当前的进位值
head.next = new ListNode( sum % 10 ); // 指向下一个节点为sum % 10. 如果 sum > 9,则为个位数,如果sum <= 9,则还是sum
head = head.next; // 维护指针
// if链表不为空才会维护指针(防止空指针异常)
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
// 出于对最后一位的考虑,如果最后carry为1的话,说明两个链表的最后一位相加>9,这个时候就需要在链表的后面再加一位.
if(carry == 1){
head.next = new ListNode(carry);
}
return prehead.next;
}
}