两个链表需要根据末尾对齐相加,为了实现这个目的,我们可以使用栈来存储两个链表的节点,任何一个时刻,栈顶的元素肯定是数字中同一个位置的(个十百千万...)。计算的时候同时弹出栈顶的元素,执行竖式加法的操作。需要注意加法中的进位,以及加法最终结果第一位还有进位的场景。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Deque<ListNode> stack1 = new ArrayDeque<>();
Deque<ListNode> stack2 = new ArrayDeque<>();
while (l1 != null || l2 != null) {
if (l1 != null) {
stack1.addLast(l1);
l1 = l1.next;
}
if (l2 != null) {
stack2.addLast(l2);
l2 = l2.next;
}
}
ListNode dummyHead = new ListNode();
int carry = 0;
while (!stack1.isEmpty() && !stack2.isEmpty()) {
ListNode node1 = stack1.removeLast();
ListNode node2 = stack2.removeLast();
int sum = node1.val + node2.val + carry;
carry = sum / 10;
ListNode newNode = new ListNode(sum % 10);
newNode.next = dummyHead.next;
dummyHead.next = newNode;
}
while (!stack1.isEmpty()) {
ListNode node = stack1.removeLast();
int sum = node.val + carry;
carry = sum / 10;
ListNode newNode = new ListNode(sum % 10);
newNode.next = dummyHead.next;
dummyHead.next = newNode;
}
while (!stack2.isEmpty()) {
ListNode node = stack2.removeLast();
int sum = node.val + carry;
carry = sum / 10;
ListNode newNode = new ListNode(sum % 10);
newNode.next = dummyHead.next;
dummyHead.next = newNode;
}
if (carry == 1) {
ListNode newNode = new ListNode(1);
newNode.next = dummyHead.next;
dummyHead.next = newNode;
}
return dummyHead.next;
}
}