解题思路:模仿加法运算,每位相加,设计一个进位来保存是否进一,直到两个链表轮巡完。
分三个步骤的同时,需要考虑两个子链表可能为空的情况:
1,两个子链表非空时,获取其节点值相加,并记录进位,一直轮巡完到其中一个子链表;
2,若此时剩下的是子链表1非空,那么就对子链表1和进位相加,直至轮巡完;
3,若此时剩下的是子链表2非空,那么就对子链表2和进位相加,直至轮巡完;
4,还要考虑是否把最后的进位增加为最后一个新节点;
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
ListNode* addEnergyValues(ListNode* l1, ListNode* l2) {
// 解题思路:模仿加法运算,每位相加,设计一个进位来保存是否进一,直到两个链表轮巡完。
// 分三个步骤的同时,需要考虑两个子链表可能为空的情况:
// 1,两个子链表非空时,获取其节点值相加,并记录进位,一直轮巡完到其中一个子链表;
// 2,若此时剩下的是子链表1非空,那么就对子链表1和进位相加,直至轮巡完;
// 3,若此时剩下的是子链表2非空,那么就对子链表2和进位相加,直至轮巡完;
// 4,还要考虑是否把最后的进位增加为最后一个新节点;
int carry = 0;
ListNode* SentryHead = new ListNode(0);
ListNode* move = SentryHead;
if(l1 == nullptr){
return l2;
}
else if(l2 == nullptr){
return l1;
}
else {
while(l1 && l2){
ListNode* NewOne = new ListNode((l1->val + l2->val + carry) % 10);
carry = (l1->val + l2->val + carry) / 10;
move->next = NewOne;
move = move->next;
l1 = l1->next;
l2 = l2->next;
}
if(l1 == nullptr){
// 还要考虑carry
while(l2){
ListNode* NewOne = new ListNode((l2->val + carry) % 10);
carry = (l2->val + carry) / 10;
move->next = NewOne;
move = move->next;
l2 = l2->next;
}
}
else {
// 还要考虑carry
while(l1){
ListNode* NewOne = new ListNode((l1->val + carry) % 10);
carry = (l1->val + carry) / 10;
move->next = NewOne;
move = move->next;
l1 = l1->next;
}
}
if(carry == 1){
ListNode* NewOne = new ListNode(carry);
move->next = NewOne;
}
return SentryHead->next;
}
}
};

京公网安备 11010502036488号