LeetCode链接:力扣
题目:
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
代码:(栈)(还可以用反转链表来做)
/**
* 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<Integer> stack1 = new ArrayDeque<>();
Deque<Integer> stack2 = new ArrayDeque<>();
//入栈
while(l1 != null){
stack1.push(l1.val);
l1 = l1.next;
}
while(l2 != null){
stack2.push(l2.val);
l2 = l2.next;
}
ListNode ans = null;
//保存进位
int bit = 0;
while(!stack2.isEmpty() || !stack1.isEmpty()){
int sum = 0;
if(stack2.isEmpty()){
sum += stack1.pop();
}else if(stack1.isEmpty()){
sum += stack2.pop();
}else{
sum += (stack2.pop() + stack1.pop());
}
//加上进位
sum += bit;
bit = sum / 10; //计算进位
sum %= 10; //余数保留
ListNode node = new ListNode(sum);
node.next = ans;
ans = node;
}
//最后一次可能存在进位,如果有还需新加一个节点
if(bit > 0){
ListNode node = new ListNode(bit);
node.next = ans;
ans = node;
}
return ans;
}
}