给定两个非空链表代表两个非负整数,每位数存储在一个倒置的链表中结点,将这两个数相加,返回结果链表.
你可以假设这两个数字不包含任何前导零,除了数字0本身。
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
思路:
可以看到链表翻转过来的数字相加如下。而题目中需要输出的链表为结果的反转708。
进位是由低位向高位进的,那么对于反转的数来说就是高位向低位进位,如下面两个链表所示,从左到右遍历链表,两数相加进位。
两个链表相加,可能会出现下面几种特殊情况:
1、一个链表长度长于另一个链表
2、相加出现进位
3、一个链表为空
以标准答案作为解析:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//一个虚链表头,方便返回结果链表
ListNode dummy = new ListNode(0);
ListNode p = l1,q = l2,curr = dummy;
//存储进位
int carry = 0;
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 dummy.next;
}