给定两个非空链表,每个元素存放一个个位数,且逆向存储。试着把这两个链表看成两个数进行加法,并返回一个单链表存放结果。
例子:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.考察单链表的遍历操作,需要注意的细节就是进位问题。比如例子中的4+6=10,向前进位1。实际上进位只可能为1或0,在这里设置一个更新的carry为进位数,每一次根据前一次计算carry,将carry加入下一次运算。
贴代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);//新创建一个链表存放结果
ListNode p=l1, q=l2, curr=dummyHead;//curr用来循环递增进行计算,最后返回不动的dummyHead
int carry=0;//carry为进位数
while(p!=null || q!=null) {
int x=(p!=null)? p.val: 0;
int y=(q!=null)? q.val: 0;
int sum = x + y + carry;
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 dummyHead.next;
}
顺带提一句x=(A)?B:C表达式,其中A为表达式,B、C为可能的赋值。意义为:当A为true时,x=B;当A为false时,x=C。话说评论里的程序员操作都要这么秀吗?路漫漫其修远兮~
在LeetCode上做完的第一道medium难度题,纪念一下~