英文题目
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
题目大意
常考题目,链表相加。
有两个链表,链表节点分别代表数字的位数,求两个链表的和。例如:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
代表:342 + 465 = 807.
解题思路
考察基本的线性表,按照十进制,把余数留到下一次个节点相加的时候就好了。
时间复杂度是o(max(m, n)).
非递归解法的时候要注意边界,只要有余数就要执行。
递归解法,可以只考虑两个节点相加,要进行两步,首先是节点相加,然后是相加的结果和余数相加。
java源码
非递归解法:
/**
* 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 head = null;
ListNode tail = null;
//余数
int remainder = 0;
while (l1 != null || l2 != null || remainder > 0) {
int a = 0, b = 0;
if (l1 != null) {
a = l1.val;
l1 = l1.next;
}
if (l2 != null) {
b = l2.val;
l2 = l2.next;
}
//记录余数.
int item = remainder + a + b;
remainder = item >= 10 ? 1 : 0;
ListNode current = new ListNode(item % 10);
if (tail == null) {
tail = current;
head = current;
} else {
tail.next = current;
tail = tail.next;
}
}
return head;
}
}
递归解法:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) {
return l1 == null ? l2 : l1;
}
int value = l1.val + l2.val;
ListNode result = new ListNode(value % 10);
//节点相加
result.next = addTwoNumbers(l1.next, l2.next);
//节点相加的结果和余数相加.
if (value >= 10) {
result.next = addTwoNumbers(new ListNode(value / 10),
result.next);
}
return result;
}