一、题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表(具体可见题目链接)
示例:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
二、解题思路:
(ps:刚看到题目第一想法是把每个节点的值取出来,得到整数再求和,再将每个数放入节点,过于繁琐,不可取,且运行的时候超时 了。。。改变思路很重要~)
第一种解法:定义t变量,后续操作均围绕此变量进行,对每个链表的相同位的节点进行循环求和取余得到新链表对应节点的值,同时对t取整(因为两个数相加,如果位数相加超过10要进1),知道两个链表都不为空,并且t的值为0(当t=1时还要往后进一位)了,结束循环。
第二种解法:暂定~
三、解法:
解法一:
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);//定义虚空头结点
ListNode cur = head;//定义当前节点,用于接收新的节点
int t = 0;//定义t变量,后续操作均依赖此变量
while (l1 != null || l2 != null || t != 0){
if (l1 != null){
t+=l1.val;
l1=l1.next;
}
if (l2 != null){
t+=l2.val;
l2=l2.next;
}
ListNode newNode = new ListNode(t%10);
t/=10;
cur.next = newNode;//新节点链接到节点的末尾处
cur = cur.next;//以链表的下一个节点作为当前节点,重新进入循环
}
return head.next;//头结点来自虚空,真正的节点从head.next开始
}
}