- 两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
方法一:假设两个链表至少有一个不空
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode node = new ListNode(0);
ListNode one = l1, two = l2, start = node;
int sum = 0;
while (one!= null || two!= null){
sum /= 10;
if(one != null){
sum += one.val;
one = one.next;
}
if(two != null){
sum += two.val;
two = two.next;
}
start.next = new ListNode(sum%10);
start = start.next;
}
if(sum/10 != 0) start.next = new ListNode(sum/10);
return node.next;
}
方法二:假设两个链表必须都不空
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode node = new ListNode(0);
ListNode one = l1, two = l2, start = node;
int sum = 0;
while (one!= null && two!= null){
sum /= 10;
sum = sum+ one.val+two.val;
one = one.next;
two = two.next;
start.next = new ListNode(sum%10);
start = start.next;
}
if(one != null){
while (one != null){
sum /= 10;
sum = sum+one.val;
one = one.next;
start.next = new ListNode(sum%10);
start = start.next;
}
}
else {
while (two != null){
sum /= 10;
sum = sum+two.val;
two = two.next;
start.next = new ListNode(sum%10);
start = start.next;
}
}
if(sum/10 != 0) start.next = new ListNode(sum/10);
return node.next;
}
方法三:递归
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return dfs(l1, l2, 0);
}
ListNode dfs(ListNode l, ListNode r, int i) {
if (l == null && r == null && i == 0) return null;
int sum = (l != null ? l.val : 0) + (r != null ? r.val : 0) + i;
var node = new ListNode(sum % 10);
if(l != null) l = l.next;
if(r != null) r = r.next;
node.next = dfs(l, r, sum / 10);
return node;
}