题:
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
想法:正常加法是以个位开始,如果列表中的节点不能反转,想要首先实现各位的加法运算,用栈比较方便;相应的空间占用会大一些;
第一步:实例化两个栈或者双端队列,用来存储给定列表,并将列表中的值压栈
第二步:对两个栈中的元素进行加操作,别忘了进位;
第三步:因为得到的元素各位百位是顺序颠倒的,因此将结果压栈,在出栈输出为链表返回;
/**
* 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) {
Deque<Integer> deque1 = new LinkedList<>(); //用来装第一个链表中的元素
Deque<Integer> deque2 = new LinkedList<>(); //用来装第二个链表中的元素
Deque<Integer> deque3 = new LinkedList<>(); //后面用来反转链的顺序
ListNode p = l1, q = l2; //头节点指针
while(p != null){ //将第一个链表压栈
deque1.push(p.val);
p = p.next;
}
while(q != null){ //将第二个链表压栈
deque2.push(q.val);
q = q.next;
}
int carry = 0; //初始化进位
while(deque1.size() != 0 || deque2.size() != 0){
int x = (deque1.size() != 0) ? deque1.poll() : 0; //栈一元素出栈
int y = (deque2.size() != 0) ? deque2.poll() : 0; //栈二元素出栈
int sums = x + y + carry;
carry = sums/10; //进位
deque3.push(sums%10); //数和直接压栈,栈三
}
if(carry != 0){ //判断最高位相加是否进位
deque3.push(carry);
}
ListNode node = new ListNode(0);
ListNode temp = node;
while(deque3.size() != 0){ //反转链表顺序
temp.next = new ListNode(deque3.poll());
temp = temp.next;
}
return node.next;
}
}
总结:
1、这道题用了双端队列Deque接口,该接口也可以实现“先进后出”,用Stack类也可以;
2、最开始 Deque deque1 而非 Deque deque1 ,前面的做法其实也可以,但是时间过 不去,而且比较占空间;