You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
翻译:
给出两条非空链表,里面储存非负整数。数字反序储存,并且每个节点只储存单独的一个数字。将这两个数字相加,再以链表的形式返回。
您可以假设这两个数字不包含任何前导零,除了数字0本身。
分析:
要求将2条链表的值相加,并且组成新的链表。
其中包含进位的运算,可以用处理大数加法的方法处理。
即从个位—>十位—>百位逐次进行加法,该数位的值用sum%10
表示,sum>10则说明要考虑进位,进位用sum/10
表示。
详细的可以参考:大数加法
这题还考查了链表的知识点,2条链表有可能长度不同,所以2个if语句需要分开判断。
另外关于dummyHead虚拟头结点,和最后输出dummHead.next的原因可以借助下图解释。
一开始ListNode dummyHead(0)
,声明一个虚拟头结点,默认next为null,值为0。
之后ListNode *p = &dummyHead
,做一个指针p指向该虚拟头结点。
通过计算得到sum%10的值后,让p->next指向新的结点,并且初始化值为sum%10p->next = new ListNode(sum%10)
最后p = p->next
,p指向新的结点。之后就是一直重复以上的操作,直到L1和L2全指向null为止。
可以发现,Dummyhead里储存的值为初始值0,是多余的,所以最后需要输出Dummyhead.next
。
即从虚拟头结点的下一个结点地址开始输出
AC代码
/**
* 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 DummyHead(0);//先做一个虚拟头结点,回头输出他的next
ListNode *p = &DummyHead;//做一个指向头结点的指针p。
int sum = 0;
while(l1!=NULL || l2!=NULL || sum>0 )
{
if(l1!=NULL)
{
sum+=l1->val;//l1->val,返回l1指针指向的某一结点内储存的值
l1 = l1->next;
}
if(l2!=NULL)
{
sum+=l2->val;
l2 = l2->next;
}
p->next = new ListNode(sum%10);//申请新的结点。
p = p->next;
sum /= 10;
}
return DummyHead.next;
}
};