刚看到题目,我首先想到的是转换成十进制数相加,试了一下当链表长度很大时不仅耗时很长,还很容易出错。因此要转变思路。我们在草稿纸上计算两个数之和时都要逐位相加的,注意到相同的位相加结果要么是10以内的数,要么是10-20内的数,超过10的要向高位进1。因此可以想到先把所有的同位的两个数相加,保存在链表里,然后遍历链表节点,如果节点的值大于等于10,则它的next位(高位)就要加1,然后把该节点的值减去10。程序有两个过程,首先是把所有的位的数相加保存在新建的链表中。然后是更新链表中所有节点值大于等于10以及它的next节点的值。
程序代码如下,执行用时40ms。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//将不同的位相加放入对应的位置
int sum = 0;
ListNode* p= new ListNode(l1->val+l2->val);
l1 = l1->next;
l2 = l2->next;
ListNode* result=p;
while (l1 != nullptr || l2 != nullptr)
{//往新的链表中加入新值
sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
p->next= new ListNode(sum);
p=p->next;
}
//根据是否要进位更改链表节点的值
p = result;
while (p != nullptr)
{//对链表中的两位数进行进位运算
if (p->val > 9)
{
p->val -= 10;
if (p->next != nullptr)
{
p->next->val += 1;
}
else
{
p->next = new ListNode(1);
}
}
p = p->next;
}
return result;
}
};