你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
样例 1:
输入: 7->1->6->null, 5->9->2->null
输出: 2->1->9->null
样例解释: 617 + 295 = 912, 912 转换成链表: 2->1->9->null
样例 2:
输入: 3->1->5->null, 5->9->2->null
输出: 8->0->8->null
样例解释: 513 + 295 = 808, 808 转换成链表: 8->0->8->null
解题思路:
实现一位一位的加法,需添加进位标志cnt,知道进位与每一位和的取值究竟是% 还是/,自己手算一下就知道了。
需要注意在相加到最高位时,如还有进位,这个进位有且仅能是一,将其添加进即可。
/**
* 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) {
int cnt = 0;
ListNode dummy = new ListNode(-1);
ListNode node = dummy;
while(l1 != null || l2 != null){
int sum = cnt;
if(l1 == null)
sum += l2.val;
else if(l2 == null)
sum += l1.val;
else
sum += l1.val + l2.val;
node.next = new ListNode(sum % 10);
node = node.next;
cnt = sum / 10;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(cnt != 0)
node.next = new ListNode(cnt);
return dummy.next;
}
}