给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
实例:
输入:(2 -> 4 ->3)+(5 -> 6 ->4)
输出:7 -> 0 -> 8
原因:342+465=807
思路:
相加实际上是两个表的表头开始相加,这两个数都是0-9的数字,相加可能会进位,如5+7=12.这种情况我们将相加得到的数字的当前数值设置为2,并将进位carry=1带入到下一次。进位carry是0或者1.
伪代码:
- 将当前结点初始化为返回列表的哑结点。
- 将进位 carrycarrycarry 初始化为 000。
- 将 ppp 和 qqq 分别初始化为列表 l1l1l1 和 l2l2l2 的头部。
- 遍历列表 l1l1l1 和 l2l2l2 直至到达它们的尾端。
- 将 xxx 设为结点 ppp 的值。如果 ppp 已经到达 l1l1l1 的末尾,则将其值设置为 000。
- 将 yyy 设为结点 qqq 的值。如果 qqq 已经到达 l2l2l2 的末尾,则将其值设置为 000。
- 设定 sum=x+y+carrysum = x + y + carrysum=x+y+carry。
- 更新进位的值,carry=sum/10carry = sum / 10carry=sum/10。
- 创建一个数值为 (summod10)(sum \bmod 10)(summod10) 的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
- 同时,将 ppp 和 qqq 前进到下一个结点。
- 检查 carry=1carry = 1carry=1 是否成立,如果成立,则向返回列表追加一个含有数字 111 的新结点。
- 返回哑结点的下一个结点。
代码:
/**
* 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 list=new ListNode(0);
ListNode p=l1,q=l2,curr=list;
int carry=0;
while(p!=null||q!=null){
int x=(p!=null)?p.val:0;
int y=(q!=null)?q.val:0;
int sum=carry+x+y;
carry=sum/10;
curr.next=new ListNode(sum%10);
curr=curr.next;
if(p!=null)p=p.next;
if(q!=null)q=q.next;
}
if(carry>0){
curr.next=new ListNode(carry);
}
return list.next;
}
}