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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目也可以理解,就是两个数字相加,不过按倒序进位,即5+5=01,不过尝试了几次输入后发现,进位只进一位便可,即一位上12+24=27
此题相对上题有些难度,给出了一个ListNode的类
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
要求返回值也是一个ListNode,写的过程中遇到过很多问题,下面是代码,注释做的比较详细
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//定义结果
ListNode result;
//先声明一个ListNode供结果使用
ListNode l3 = new ListNode(-1);
result = l3;
ListNode listNode = l1;
ListNode listNode1 = l2;
//如果l1或l2为空时直接返回另一个就好
if(l1 == null)
return l2;
if(l2 == null)
return l1;
//定义每一位的数字加和
int sum = 0;
//该flag为是否进位的标志
boolean flag = false;
//注1
while(listNode != null || listNode1 != null || flag) {
//每次循环定义加和为0
sum = 0;
if(listNode != null){
//若不为空,sum加上节点的值,节点往后推一
sum += listNode.val;
listNode = listNode.next;
}
if(listNode1 != null){
sum += listNode1.val;
listNode1 = listNode1.next;
}
//若上一位有进位,则sum加一
if(flag){
sum ++;
}
//若sum结果大于10,则进位,并将sum减十
if(sum >= 10){
flag = true;
sum -= 10;
} else{
//若sum不大于10,则不进位
flag = false;
}
//将加和写入结果节点,并将结果节点往后推一
l3.next = new ListNode(sum);
l3 = l3.next;
}
//结果第一个节点为-1,直接略过
return result.next;
}
/**
* 注1
* 循环控制的条件为两个输入节点串(姑且这么叫)不一定登场,应取最长的长度
* 但是发现有一种输入是输入两个单节点5,输出应是双节点[0,1]
* 所以又加了一个判断条件为flag
* 即 循环终止条件为
* 两个输入节点串都达到最长 且 最后一位不需要进位(flag为false)
*/
以上结果AC
LeetCode是个好东西 真的 给自己加个油