题目链接:两数相加
分析:
在两数相加的过程中,存在下面三种情况:
1. A的位上有数字,B的位上也有数字
那么相加后的和的该位上的数值应该是A的该位上对应的数字加上B的该位上对应的数字再加上前面的进位val
该位上的数字,应该是上面的得到的和对10取余,例如和为15,那么该位上的数字应该是5
进位也应该是一个和除10 的操作,例如和为15,进位就应该是1
2. A的位上有数字,B的位上没有数字
和应该是A上的数字加上前面的进位,该位上的数字也是和进行对10取余操作,进位也是和进行除10
3. A,B上均没有数字
那么看前面的仅为是否为1,如果是1创建一个值为1的节点就好
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
ListNode dummy = new ListNode(0);
ListNode current = dummy;
int carry = 0;
while (l1 != null && l2 != null) {
int dig = l1.val + l2.val + carry;
int val = dig % 10;
carry = dig / 10;
ListNode newnode = new ListNode(val);
current.next = newnode;
current = current.next;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
int val = (l1.val + carry) % 10;
carry = (l1.val + carry) / 10;
current.next = new ListNode(val);
current = current.next;
l1 = l1.next;
}
while (l2 != null) {
int val = (l2.val + carry) % 10;
carry = (l2.val + carry) / 10;
current.next = new ListNode(val);
current = current.next;
l2 = l2.next;
}
if (carry != 0)
current.next = new ListNode(carry);
return dummy.next;
}
}
第二种解法:
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode prev = new ListNode(0);
ListNode head = prev;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
ListNode cur = new ListNode(0);
int sum = ((l2 == null) ? 0 : l2.val) + ((l1 == null) ? 0 : l1.val) + carry;
cur.val = sum % 10;
carry = sum / 10;
prev.next = cur;
prev = cur;
l1 = (l1 == null) ? l1 : l1.next;
l2 = (l2 == null) ? l2 : l2.next;
}
return head.next;
}
}