题目:
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
解答:
方法一:利用栈方法求解
1.将两个链表分别从左往右遍历,遍历过程中将值压栈,这样就生成了两个链表节点值的逆序栈,分别表示为s1和s2
例如:链表9->3->7.s1从栈顶到栈底为7,3,9;链表6->3,s2从栈顶到栈底为3,6.
2.将s1和s2同步弹出,这样就相当于两个链表从低位到高位依次弹出,在这个过程中生成相加链表即可,同时需要关注每一步是否有进位,用ca表示。
例如:s1先弹出7,s2弹出3,这一步相加结果为10,产生了进位,令ca=1,然后生成一个值为0的新节点,记为new1;s1再弹出3,s2再弹出6,这时进位为ca=1,所以这一步相加结果为10,继续产生进位,仍令ca=1,然后再弹出一个节点值为0的新节点记为new2,令new2.next = new1;s1再弹出9,s2为空,这时ca为1,这一步相加结果为10,仍令ca=1,然后生成一个节点值为0的新节点,记为new3,令new3.next = new2.这一步也是模拟简单的从低位到高位进位相加的过程。
3.当s1和s2都为空的情况下,还要关注一下进位信息是否为1,如果为1,比如步骤2中的例子,表示还要生成一个节点值为1的新节点,记为new4,new4.next = new3;
4.返回新生成的结果链表即可。
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) {
// write code here
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
while(head1 != null){
s1.push(head1.val);
head1 = head1.next;
}
while(head2 != null){
s2.push(head2.val);
head2 = head2.next;
}
int ca = 0;
int n1 = 0;
int n2 = 0;
int n = 0;
ListNode node = null;
ListNode pre = null;
while(!s1.isEmpty() || !s2.isEmpty()){
n1 = s1.isEmpty() ? 0 : s1.pop();
n2 = s2.isEmpty() ? 0 : s2.pop();
n = n1 + n2 + ca;
pre = node;
node = new ListNode(n % 10);
node.next = pre;
ca = n /10;
}
if(ca == 1){
pre = node ;
node = new ListNode(1);
node.next = pre;
}
return node;
}
}