题目
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
提示:
链表的长度范围为 [1, 100]
0 <= node.val <= 9
输入数据保证链表代表的数字无前导 0
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lMSNwu
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路:要求不更改链表中指针,因此可以考虑采用栈。java中栈官方推荐不使用stack而是deque,还是push和pop,同时有addfirst等。
关于按位相加,设置,carry和cur,carry=cur/10,cur=cur%10.
小tips:要在while循环的判断条件中加入carry!=0,最后一次stack1,2取空之后,如果有进位,还需要再加一个最高位结点。
代码:
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 result=null;
int carry=0;
while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0) {//注意进位!=0
int a=stack1.isEmpty() ? 0:stack1.pop();
int b=stack2.isEmpty() ? 0:stack2.pop();
int cur=a+b+carry;
carry=cur/10;
cur%=10;
ListNode tmp=new ListNode(cur);
tmp.next=result;
result=tmp;
}
return result;
}
}