原题
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 contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
翻译
给定两个非空链表来表示两个非负整数列。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数列都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
答案
/**
* 定义单向链表
*/
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
/**
* 算法思想:
* 1. 定义一个虚链头dummyHead,其next值指向方法返回链表的第一个节点
* 2. 定义一个游标curr,代表当前节点,每生成一个新节点就指向下一个
* 3. 由于满10进1,所以定义一个整数保存l1和l2对应节点值的10的倍数,用于进位
* 4. 当l1当前节点不为空或l2当前节点不为空时
* a. 取出各自节点的值x, y,若为空则设为0
* b. 计算x, y的和sum
* c. 计算进位值carry
* d. 对sum取余算出新节点的值,curr的next指向该新节点
* e. 若l1不为空,则l1指向下一个节点;同理作用于l2
* 5. 若最后的进位值大于0,则再新建一个节点,curr的next指向该新节点
* 6. 返回虚链头dummyHead的下一个节点
*/
public class AddTwoNumbers {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;
int carry = 0;
while (l1 != null || l2 != null) {
int x = (l1 != null ? l1.val : 0);
int y = (l2 != null ? l2.val : 0);
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
}