题目:
链接:力扣https://leetcode.cn/problems/add-two-numbers/
刚看到题目时 我的思路是:将链表转换为一个十进制的数字,进行反转,接着两数相加, 然后取整数的各个为插入链表;即:
最初我也是按照这个思路写的代码;如果链表的长度只有几位这种方法是可以跑过去的;但是我没有注意题目中链表的长度在1-100之间;那这样存在一个问题long long 类型数据最大2^63-1,当链表太长时没有类型可以放下由链表变换来的数字;那这种方法也就是错误的方法。
其实我们仔细读题可以发现每个数字是按逆序放在链表里的,也就是说我们将位置相同的节点相加,结果在一个新创建的链表中进行尾插不就直接得到答案了,其实大致的思路是可行的,但要考虑同位置节点相加大于10时需要进位,也就是将十位的数与下一个位置的节点相加完成进位。另外还有一点我们是进行同位置的节点相加,如果链表的长度不同我们就要用0补上。还有一些细节在代码中讲解,如下:
代码:
struct ListNode* BuyNote(int x)
{
struct ListNode* New = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(New);
New->val = x;
New->next = NULL;
return New;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//因为链表的逆序,所以让两个链表的相同位置相加,放入新的链表,若相加大于10则进一 将进的一与后面的相加
struct ListNode* head = BuyNote(0);
assert(head);
struct ListNode* tail = head;
tail->next = NULL;
struct ListNode* cur1 = l1;
struct ListNode* cur2 = l2;
int degree = 0; //存进位
int n3 = 0;
while(cur1 || cur2)
{
int n1 = (cur1 == NULL ? 0 : cur1->val);
int n2 = (cur2 == NULL ? 0 : cur2->val);
n3 = n1 + n2 + degree;
if(n3 >= 10)
{
degree = n3 / 10;
n3 = n3 % 10;
}
else
{
degree = 0;
}
struct ListNode* NewNote = BuyNote(n3);
tail->next = NewNote;
tail = tail->next;
if(cur1)
{
cur1 = cur1->next;
}
if(cur2)
{
cur2 = cur2->next;
}
}
if(degree != 0)
{
struct ListNode* NewNote = BuyNote(degree);
tail->next = NewNote;
tail = tail->next;
}
return head->next;
}
今天的博客就到这了,若你有更好的解题方法,欢迎留言^_^



