题目描述:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
解题思路
看到这个题时,就应该明白用 栈 进行处理
- 将两个单向线标的数字放进不同的栈中
- 从栈顶以此取出数据相加,如果相加大于10就进位1,不然进位0
- 将相加的数一次链接成链表,返回首地址
解题代码:
public static NodeDemo addTwoNumbers(NodeDemo l1, NodeDemo l2) {
StackDemo<Integer> stack1 = new StackDemo<Integer>();
StackDemo<Integer> stack2= new StackDemo<Integer>();
while (l1!=null){
stack1.push(l1);
l1 = l1.getNext();
}
while (l2!=null){
stack2.push(l2);
l2 = l2.getNext();
}
Integer jinwei = 0;
NodeDemo result = null;
System.out.println(1);
while(!stack1.isEmpty()||!stack2.isEmpty()){
int re1 = stack1.isEmpty()? 0 : stack1.pop().getValue();
int re2 = stack2.isEmpty()? 0 : stack2.pop().getValue();
int a = (re1+re2)%10;
NodeDemo node = new NodeDemo(a+jinwei);
System.out.println(a+jinwei);
node.setNext(result);
result = node;
jinwei = (re1+re2)/10;
}
return result;
}
知识拓展:
栈的创建及入栈出栈等方法
栈节点定义:
public class Nodeclass<T> {
private T data ;
private Nodeclass<T> next;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Nodeclass<T> getNext() {
return next;
}
public void setNext(Nodeclass<T> next) {
this.next = next;
}
@Override
public String toString() {
return "Nodeclass{" +
"data=" + data +
", next=" + next +
'}';
}
}
栈创建及方法定义:
public class Stack_demo1<T> {
Nodeclass<T> stack = new Nodeclass<T>();
//入栈的方法
public void push(Nodeclass add){
if (stack == null){
stack = add;
}else{
add.setNext(stack);
stack = add;
}
}
//出栈的方法
public Nodeclass<T> pop(){
Nodeclass<T> res = stack;
if(stack != null){
stack = stack.getNext();
}
return res;
}
//判断为空,为空返回true
public Boolean isEmpty(){
if (stack == null){
return true;
}else{
return false;
}
}
//查看栈顶元素
public Nodeclass<T> top(){
return stack;
}
}
个人收获:
栈结构确实是很有用,首次接触数据结构就了解到栈,一个先进后出的数据结构 ,上面栈的定义代码是大概半年前写的,当时为了学习栈的思想,但是总是找不到java自带的栈,所以只能手写一个,不过写了一遍之后可能两年之内不会忘记