思路
根据两个链表相加的特点,可以使用三个栈来模拟两个链表相加,第一个栈存第一个链表的头到尾节点,第二个链表存第二个链表的头到尾巴节点,由于节点值的进位是指向头节点,待前两个栈存完节点后取出相加,保留进位值,可以做到进位值随着栈的取出到达前一个节点,把前两个栈取出的值和进位值相加得到的值重新创一个ListNode节点存入第三个栈,当前两个栈都取空的时候,将第三个栈的节点循环取出重构链表即可得到结果,
代码
public ListNode addInList (ListNode head1, ListNode head2) { // write code here Stack<ListNode> stack1 = new Stack<>(); //存第一个链表的节点 Stack<ListNode> stack2 = new Stack<>(); //存第二个链表的节点 Stack<ListNode> stack3 = new Stack<>(); //存相加后链表的节点 ListNode tail = new ListNode(0); //初始化重构后的链表 ListNode result = tail; //定义解为重构链表的头节点 if (head1==null||head2==null){ if (head1==null){ return head2; }else { return head1; } } while (head1!=null){ stack1.add(head1); head1=head1.next; } while (head2!=null){ stack2.add(head2); head2=head2.next; } int val1=0; //存第一个栈取出的值 int val2=0; //存第二个栈取出的值 int sum =0; //存val1,val2,next的和 int next=0; //定义进位值并初始化 while (!stack1.empty()||!stack2.empty()){ if (!stack1.empty()&&!stack2.empty()){ val1=stack1.pop().val; val2=stack2.pop().val; sum=val1+val2+next; int val=sum%10; stack3.push(new ListNode(val)); next=sum/10; } if (!stack1.empty()&&stack2.empty()){ val1=stack1.pop().val; sum=val1+next; int val=sum%10; stack3.push(new ListNode(val)); next=sum/10; } if (stack1.empty()&&!stack2.empty()){ val2=stack2.pop().val; sum=val2+next; int val=sum%10; stack3.push(new ListNode(val)); next=sum/10; } } while (!stack3.empty()){ ListNode node=new ListNode(stack3.pop().val); tail.next=node; tail=tail.next; } return result.next; }