给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
链表不能修改该,换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
使用栈的特性,先进后出
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<Integer> l1Stack = buildStack(l1);
Stack<Integer> l2Stack = buildStack(l2);
//定义一个头节点
ListNode head=new ListNode(-1);
ListNode p=head;
//定义一个进位变量
int carry=0;
//遍历两个栈的时候,依次出栈的数据相加,即代表从低位开始相加
while(!l1Stack.isEmpty()||!l2Stack.isEmpty()||carry!=0){
int x=l1Stack.isEmpty()? 0:l1Stack.pop();
int y=l2Stack.isEmpty()? 0:l2Stack.pop();
int sum=x+y+carry;
ListNode node=new ListNode(sum%10);
//相当于把当前节点node插入到已有的链表中的头部
//将7插入到已经构造好的链表的首部(head下一个节点) head->8->0->7
node.next=head.next;
head.next=node;
carry=sum/10;
}
return head.next;
}
private Stack<Integer> buildStack(ListNode l) {
Stack<Integer> stack = new Stack<>();
while (l != null) {
stack.push(l.val);
l = l.next;
}
return stack;
}