1、思路
肯定是用栈的嘞:说到这你就明白了吧!当然也需要一个变量来记录进位的数据了,详情看代码。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
// 判断边界条件
if(head1 == null)
return head2;
if(head2 == null){
return head1;
}
// 1.使用两个辅助栈,利用栈先进后出,相当于反转了链表
Stack<ListNode> stack1 = new Stack<>();
Stack<ListNode> stack2 = new Stack<>();
ListNode p1=head1;
ListNode p2=head2;
// 2.将两个链表的结点入栈
while(p1!=null){
stack1.push(p1);
p1=p1.next;
}
while(p2!=null){
stack2.push(p2);
p2=p2.next;
}
// 进位
int tmp = 0;
// 创建新的链表头节点
ListNode head = new ListNode(-1);
ListNode nHead = head.next;
while(!stack1.isEmpty()||!stack2.isEmpty()){
// val用来累加此时的数值(加数+加数+上一位的进位=当前总的数值)
int val = tmp;
// 栈1不为空的时候,弹出结点并累加值
if (!stack1.isEmpty()) {
val += stack1.pop().val;
}
// 栈2不为空的时候,弹出结点并累加值
if (!stack2.isEmpty()) {
val += stack2.pop().val;
}
// 求出进位
tmp = val/10;
// 进位后剩下的数值即为当前节点的数值
ListNode node = new ListNode(val%10);
// 将结点插在头部
node.next = nHead;
nHead = node;
}
if(tmp > 0){
// 头插
ListNode node = new ListNode(tmp);
node.next = nHead;
nHead = node;
}
return nHead;
}
}