题目:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
代码:
方法一:链表逆序
/**
* 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 head1 = helper(l1); // 将 l1 反转
ListNode head2 = helper(l2); // 将 l2 反转
ListNode newHead = new ListNode(-1); // 新链表
ListNode tail = newHead;
int tmp = 0; // 统计进位
boolean tag = false; // 判断 head1 是否为 null
boolean tag1 = false; // 判断 head2 是否为 null
// 只要 head1 和 head2 还有不为 null 以及 tmp 进位不为 0 就继续往下添加节点
while (!tag || !tag1 || tmp != 0) {
int sum = tmp;
sum += !tag ? head1.val : 0;
sum += !tag1 ? head2.val : 0;
tail.next = new ListNode(sum % 10);
tmp = sum / 10;
tail = tail.next;
if (!tag) {
head1 = head1.next;
tag = head1 == null ? true : false;
}
if (!tag1) {
head2 = head2.next;
tag1 = head2 == null ? true : false;
}
}
// 注意最后要返回新链表反转后的节点
return helper(newHead.next);
}
// 反转链表
public ListNode helper(ListNode p) {
ListNode Next = null;
ListNode prev = null;
while (p != null) {
Next = p.next;
p.next = prev;
prev = p;
p = Next;
}
return prev;
}
}
方法二:栈
/**
* 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.add(l1.val);
l1 = l1.next;
}
while (l2 != null) {
stack2.add(l2.val);
l2 = l2.next;
}
ListNode head = null;
int tmp = 0; // 进位数
int sum = 0;
while (!stack1.isEmpty() || !stack2.isEmpty() || tmp != 0) {
sum = tmp;
sum += stack1.isEmpty() ? 0 : stack1.pop();
sum += stack2.isEmpty() ? 0 : stack2.pop();
// 链表反转
ListNode node = new ListNode(sum % 10);
node.next = head;
head = node;
tmp = sum / 10; // 计算进位数字
}
return head;
}
}