今天这道题我的第一思路其实是用链表翻转,然后再相加。
看了题解,发现使用栈的方法更轻松一点。
除了头插法没有使用哨兵以外还学习到了栈的使用方法:
定义栈: Stack stack1 = new Stack<>();
入栈: stack1.push();
出栈:stack1.pop();
判空栈:stack1.isEmpty();
/**
* 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) {
// 定义两个栈
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
// 入栈
while(l1!=null){
stack1.push(l1.val);
l1=l1.next;
}
while(l2!=null){
stack2.push(l2.val);
l2=l2.next;
}
// 定义进位
int carry = 0;
ListNode head = null;
while(!stack1.isEmpty() || !stack2.isEmpty() || carry>0){
// 加进位
int sum = carry;
// 不空则加起来当前值
if(!stack1.isEmpty()){
sum+=stack1.pop();
}
if(!stack2.isEmpty()){
sum+=stack2.pop();
}
// 头插法,没有哨兵
// 把余数存到链表中
ListNode node = new ListNode(sum%10);
node.next = head;
head = node;
// 设置下一次进位值
carry = sum / 10;
}
return head;
}
}