class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode xList = new ListNode(0); //创建首节点
ListNode newList= xList; //声名一个变量用来在移动过程中指向当前节点
int curr = 0;
while(l1 != null || l2 != null){
//获取链表的值
int x = l1 != null ? l1.val:0;
int y = l2 != null ? l2.val:0;
//计算和
int sum = x + y + curr;
curr = sum /10 ;
ListNode sumNode = new ListNode(sum % 10 ); //生成新的节点
//移动指针指向下一个值
newList.next= sumNode; //把新节点连起来
newList = newList.next; //当前节点往后移动
if(l1 != null) l1 = l1.next; //将节点向后移动,对l1的下一个节点进行处理
if(l2 != null) l2 = l2.next; //将节点向后移动,对l2的下一个节点进行处理
}
if(curr > 0){
newList.next = new ListNode(curr);
}
return xList.next;
}
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result=nullptr;
ListNode* p=nullptr;//移动指针
int b=0;
while(l1||l2){
int n1 = l1 ? l1->val: 0;//等号后面看成一个整体,判l1若不为空,则等于其值,若为空,则等于0
int n2 = l2 ? l2->val: 0;//原理同l1
int a=n1+n2+b;
b=a/10;//进位
a=a%10;//该位的值
//下9行将每位相加结果放到链表里
if(!result)//之所以要判result是否为空,是因为最后要返回结果链表头节点,故只能移动指针p,然而对第一位的处理是需要让result链到头结点处,而后续的处理是只需对p指针进行,故应分开;(这里卡了,看了很多题解。。理解了一下,应该是这样,欢迎指正)
{
result=p=new ListNode(a);//创建新节点,新节点的val是a
}
else
{
p->next=new ListNode(a);
p=p->next;
}
if(l1){
l1=l1->next;//后移
}
if(l2){
l2=l2->next;
}
}
if(b>0){//容易忽略,最后的进位处理
p->next=new ListNode(b);
}
return result;//最后要返回链表
}
};
作者:lujie-23
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/c-2liang-shu-xiang-jia-jian-dan-yi-dong-janfs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。