1.题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
2.易理解版本
2.1 解题思路
题中链表顺序正好是低位到高位,先低位相加,有进位保持,下一位计算加上进位,直到最高位相加,如果有进位,生成新的结点保存。
2.2 我的代码
//两数相加 //没有创建全新的链表,使用L1、L2中较长的保存结果 class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { unsigned int count1 = 0, count2 = 0;//统计两个链表长度 unsigned int carry = 0; //进位 while (l1 != NULL && l2 != NULL) { l1->val = (l1->val + l2->val + carry) % 10; l2->val = (l1->val + l2->val + carry) % 10; //判断有无进位 if ((l1->val + l2->val + carry) / 10 != 0) carry = 1; else carry = 0; // ((l1->val + l2->val + carry) / 10 != 0)?carry = 1 : carry = 0 ; l1 = l1->next; l2 = l2->next; } if (l1 != NULL) { //L1更长,剩余链表处理 while (l1 != NULL) { l1->val = (l1->val + carry) % 10; if ((l1->val + carry) / 10 != 0) carry = 1; else carry = 0; l1 = l1->next; } if (l1 == NULL && carry == 1) ListNode(1); return l1; } else { //L2更长,剩余链表处理 while (l2 != NULL) { l2->val = (l2->val + carry) % 10; if ((l2->val + carry) / 10 != 0) carry = 1; else carry = 0; l2 = l2->next; } if (l2 == NULL && carry == 1) ListNode(1); return l2; } } };
3.简洁版本
class Solution { public: ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { ListNode *res = new ListNode(-1);//存储结果 ListNode *cur = res; int carry = 0; while (l1 || l2) { int n1 = l1 ? l1->val : 0; int n2 = l2 ? l2->val : 0; int sum = n1 + n2 + carry; carry = sum / 10; cur->next = new ListNode(sum % 10); cur = cur->next; if (l1) l1 = l1->next; if (l2) l2 = l2->next; } if (carry) cur->next = new ListNode(1); return res->next; } };//潜在问题:memory leak, ListNode *res = new ListNode(-1);没有最后释放。
4.用时更少的范例
//来源:Leetcode官网提交的答案/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ //优化C++I/O提速 static const auto __ = []() { ios::sync_with_stdio(false); cin.tie(nullptr); return nullptr; }(); class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* L_result = new ListNode(0); ListNode* a = l1; ListNode* b = l2; ListNode*cur = L_result; int carry = 0; while(a != NULL || b != NULL) { int val1 = a != NULL ? a->val : 0; int val2 = b != NULL ? b->val : 0; int sum = val1 + val2 + carry; carry = bool(sum / 10); cur->next = new ListNode(sum %10); //先判是否为空,再赋值 if(a != NULL) { a = a->next; } if(b != NULL) { b = b->next; } cur = cur->next; } if(carry) { cur->next = new ListNode(1); } return L_result->next; } };
参考资料:
1. [LeetCode] Add Two Numbers 两个数字相加
原文地址:https://www.cnblogs.com/paulprayer/p/10029750.html
时间: 2024-11-05 03:12:56