题目链接:https://leetcode-cn.com/problems/add-two-numbers-ii/
题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
第一次编辑代码:
/**
* 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 num1 = 0;
int num2 = 0;
while(l1 != null){
num1 = num1*10 + l1.val;
l1 = l1.next;
}
while(l2 != null){
num2 = num2*10 + l2.val;
l2 = l2.next;
}
int sum = num1 + num2;
if(sum == 0)
return new ListNode(0);
ListNode ans = null;
while(sum != 0){
ListNode newNode = new ListNode(sum%10);
newNode.next = ans;
ans = newNode;
sum /= 10;
}
return ans;
}
}
提交结果
解答错误。
反思
不能表示大于int型的数。
第二次编辑代码:
/**
* 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) {
ListNode num1 = null;
ListNode num2 = null;
while(l1 != null){
ListNode newNode1 = new ListNode(l1.val);
newNode1.next = num1;
num1 = newNode1;
l1 = l1.next;
}
while(l2 != null){
ListNode newNode2 = new ListNode(l2.val);
newNode2.next = num2;
num2 = newNode2;
l2 = l2.next;
}
ListNode sum = null;
int carry = 0;
while(num1 != null && num2 != null){
int temp = num1.val + num2.val + carry;
carry = temp/10;
temp %= 10;
ListNode newNode3 = new ListNode(temp);
newNode3.next = sum;
sum = newNode3;
num1 = num1.next;
num2 = num2.next;
}
while(num1 != null){
int temp = num1.val+carry;
carry = temp/10;
temp %= 10;
ListNode newNode4 = new ListNode(temp);
newNode4.next = sum;
sum = newNode4;
num1 = num1.next;
}
while(num2 != null){
int temp = num2.val+carry;
carry = temp/10;
temp %= 10;
ListNode newNode5 = new ListNode(temp);
newNode5.next = sum;
sum = newNode5;
num2 = num2.next;
}
if(carry != 0){
ListNode newNode6 = new ListNode(carry);
newNode6.next = sum;
sum = newNode6;
}
return sum;
}
}
反思
有代码更简练的写法,用栈,不过效率不高,这里参考@Sweetiee的写法。
第三次编辑代码:
/**
* 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) {
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
while(l1 != null){
stack1.push(l1.val);
l1 = l1.next;
}
while(l2 != null){
stack2.push(l2.val);
l2 = l2.next;
}
int carry = 0;
ListNode head = null;
while(!stack1.isEmpty() || !stack2.isEmpty() || carry > 0){
int sum = carry;
sum += stack1.isEmpty() ? 0 : stack1.pop();
sum += stack2.isEmpty() ? 0 : stack2.pop();
ListNode node = new ListNode(sum%10);
node.next = head;
head = node;
carry = sum/10;
}
return head;
}
}