给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
以下代码中,我们定义了一个名为Solution
的类,其中包含一个公共函数addTwoNumbers
,该函数用于计算两个二进制数的和,并返回一个新的链表头指针。
在函数中,我们首先创建一个新的链表头指针head
,并将其指向-1
,表示该链表为空。然后,我们定义一个指针h
,并将其初始化为head
。
接下来,我们定义一个整数变量sum
,用于存储每个位的加和结果。我们还定义一个布尔变量carry
,用于表示当前进位的状态。
在循环中,我们首先将sum
初始化为0,然后依次将l1
和l2
的值加到sum
中。当其中一个指针为NULL
时,表示两个指针都已经到达链表的末尾,此时我们将当前位的加和结果存储到新创建的节点中,并将指针移动到下一个节点。
在每次循环中,我们还需要判断是否需要进位。如果当前位的值为1,则需要进位,否则不需要进位。
最后,我们将新创建的节点连接到链表的末尾,并返回头指针head
的下一个节点,即计算结果的链表。
需要注意的是,在实际应用中,我们需要根据具体的需求和场景,选择合适的算法和数据结构,并进行适当的优化和调整,以提高算法的效率和性能。同时,我们还需要注意代码的可读性和可维护性,避免出现复杂的控制结构和深层嵌套等问题。
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head=new ListNode(-1);//存放结果的链表
ListNode* h=head;//移动指针
int sum=0;//每个位的加和结果
bool carry=false;//进位标志
while(l1!=NULL||l2!=NULL)
{
sum=0;
if(l1!=NULL)
{
sum+=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
sum+=l2->val;
l2=l2->next;
}
if(carry)
sum++;
h->next=new ListNode(sum%10);
h=h->next;
carry=sum>=10?true:false;
}
if(carry)
{
h->next=new ListNode(1);
}
return head->next;
}
};