题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路
在一条链表上进行计算,将所得结果赋值在两条链表对应的位置上,把长的那条链表赋值给要输出的链表,再对链表中val超过10的数字进行处理,因为两个个数相加不可能超过18,所以只有进1的可能,如果最后一位还要进位,要先创建一个val为1的NodeList类型的值,把它连在要输出的链表的尾端。
代码
/**
* 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 n1=l1;
ListNode n2=l2;
while(true){
if(n1==null||n2==null)
break;
n1.val+=n2.val; // 将两条链表对应的位置相加,再赋值到两条链表的对应位置上
n2.val=n1.val;
n1=n1.next;
n2=n2.next;
}
ListNode out;
if(n1==null){ // 将长的那条链表赋值给要输出的链表
out=l2;
}else{
out=l1;
}
ListNode n3=out;
while(n3.next!=null){ // 将超过10的数字向后进一位
if(n3.val>=10){
n3.next.val++;
n3.val-=10;
}
n3=n3.next;
}
if(n3.val>=10){ // 如果最后一位还有进位,先创建一个节点放在后面再连接
n3.next=new ListNode(1);
n3.val-=10;
}
return out;
}
}