两条链表求和
题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
解题思路
如果直接相加考虑到需要进位的情况,由于是单向链表,所以不能直接相加,借助链表翻转,将其个位数排在前边,在进行相加。
因此,首先先对链表进行翻转,翻转链表可以考虑递归,以及上次的前后指针,此处借用栈的结构进行处理,先进后出,然后在栈中每次弹出一个进行相加,并设置进位变量。
代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<Integer> stack1=new Stack<>(),stack2=new Stack<>();
ListNode q1=l1,q2=l2;
//利用栈进行链表翻转
while(q1!=null){
stack1.push(q1.val);
q1=q1.next;
}
while(q2!=null){
stack2.push(q2.val);
q2=q2.next;
}
// 定义一个空节点,用来存储相加后的值
ListNode dummy=new ListNode(-1);
int carry=0;
//当栈不为空的时候执行循环体内的加法操作
while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){
int value=carry;
if(!stack1.isEmpty()){
value+=stack1.pop();
}
if(!stack2.isEmpty()){
value+=stack2.pop();
}
//判断是否进位
carry=value/10;
value=value%10;
// 将得到的值进行存储
ListNode node=new ListNode(value);
node.next=dummy.next;
dummy.next=node;
}
return dummy.next;
}
}