原题如下
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解题思路
两个链表同时开始处理,分别取出两个链表的第一个结点进行求和,然后求这个和的进位,作为下一个结点需要加的值。同时记录余数作为本结点的值,循环处理,直到所有结点都处理完。对最后一个结点,如果大于10就要进行处理。添加一个结点表示1.
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode target = new ListNode(0); //头结点
ListNode node = target; //结点
int sum = 0; //每个结点的和
while (l1 != null || l2 != null) {
sum /= 10; //求本次的进位
if (l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}
node.next = new ListNode(sum % 10); //该结点的值 就是结点和的余数
node = node.next; //指向下一个结点
}
if (sum / 10 == 1) //对最后一个结点进行处理
node.next = new ListNode(1);
return target.next;
}
}
评测结果
leetCode中文版网站链接点击打开链接