题干
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
想法
不让反转链表,那就用栈反转
注意进位就行了 比较简单
Java代码
package daily;
import util.ListNode;
import java.util.*;
public class AddTwoNumbers {
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;
}
ListNode last=null;
//进位
int carry=0;
//栈吐出来
while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){
int sum=carry;
if(!stack1.isEmpty()){
sum+=stack1.pop();
}
if(!stack2.isEmpty()){
sum+=stack2.pop();
}
//此时位数
ListNode tem=new ListNode(sum%10);
//放到现在的前边
tem.next=last;
last=tem;
//新的进位
carry=sum/10;
}
return last;
}
public static void main(String [] args){
AddTwoNumbers addTwoNumbers=new AddTwoNumbers();
ListNode l1=new ListNode(7);
ListNode l2=new ListNode(5);
l1.next=new ListNode(2);
l1.next.next=new ListNode(4);
l1.next.next.next=new ListNode(3);
l2.next=new ListNode(6);
l2.next.next=new ListNode(4);
ListNode head=addTwoNumbers.addTwoNumbers(l1,l2);
while(head!=null){
if(head.next==null){
System.out.printf(String.valueOf(head.val));
}
else {
System.out.printf(head.val + "->");
}
head = head.next;
}
}
}