LeetCode—2. Add Two Numbers
题目:
https://leetcode.com/problems/add-two-numbers/description/
给出2个链表,每个链表代表一个非负整数,数字以反序的方式存储在链表的每个节点里。现要求将这两个相加,并将结果按相同的方式存储到链表里。
思路及解法
首先能想到的最简单的方法,将数字的每一位取出来放到Java的list里,然后按位相加得到结果,再讲结果放回到链表里。不过这种方法写出的代码 Memory Limit Exceeded,不知道是不是我代码的问题(囧。。。。)
另外一个方法是参考的网上的资料,九章算术的方法。维护一个当前结果位sum % 10和进位carry。时间复杂度O(n),空间复杂度1
代码
内存不足
/**
* 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;
List<Integer> listNum1 = new ArrayList<Integer>();
List<Integer> listNum2 = new ArrayList<Integer>();
while(l1 != null){
listNum1.add(l1.val);
l1 = l1.next;
}
while(l2 != null){
listNum2.add(l2.val);
l2 = l2.next;
}
for(int i=0; i<listNum1.size(); i++){
num1 += listNum1.get(i) * Math.pow(10, i);
}
for(int i=0; i<listNum2.size(); i++){
num2 += listNum2.get(i) * Math.pow(10, i);
}
int sum = num1 + num2;
ListNode l3 = new ListNode(0);
ListNode point = new ListNode(0);
ListNode temp = new ListNode(0);
point = l3;
while(sum > 10){
point.val = sum%10;
point.next = temp;
point = temp;
sum /= 10;
}
point.val = sum%10;
return l3;
}
}
/**
* 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) {
if(l1 == null && l2 == null) return null;
ListNode point = new ListNode(0);
ListNode head = point;
int carry = 0;
while(l1 != null && l2 != null){
int sum = carry + l1.val + l2.val;
point.next = new ListNode(sum % 10);
point = point.next;
carry = sum /10;
l1 = l1.next;
l2 = l2.next;
}
while(l1 != null){
int sum = carry + l1.val;
point.next = new ListNode(sum % 10);
point = point.next;
carry = sum /10;
l1 = l1.next;
}
while(l2 != null){
int sum = carry + l2.val;
point.next = new ListNode(sum % 10);
point = point.next;
carry = sum /10;
l2 = l2.next;
}
if(carry != 0){
point.next = new ListNode(carry);
}
return head.next;
}
}