leetcode 链表里的两数相加 C++实现
2018-12-13 23:47
337 查看
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
实现代码如下:
/** * 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) { ListNode* SumNode = new ListNode(0); ListNode* TempNode = new ListNode(0); if(l1 == NULL && l2 == NULL) return SumNode; // 都为空,直接返回。 int up = 0; ListNode* CurNode; SumNode->val = l1->val + l2->val; if(SumNode->val >= 10) // 判断是否需要进位,需要的话保留。 { up = 1; SumNode->val %= 10; } if(l1->next == NULL && l2->next == NULL) // 是否都为空,如果是的话,判断有无进位,有的话再次递进 { if(up != 1) { return SumNode; } l1 = l1->next; l2 = l2->next; } else // 否则进行看是否有其中一个下一个指向为空,分别进行处理。 { if(l1->next != NULL) { if(up == 1) { l1->next->val +=1; up = 0; } l1 = l1->next; } else l1 = TempNode; // 如果指向为空的话,为传递的参数指定一个值为0的指针,方便递进。 if(l2->next != NULL) { if(up == 1) { l2->next->val +=1; up = 0; } l2 = l2->next; } else l2 = TempNode; } CurNode = addTwoNumbers(l1, l2); // 递进 SumNode->next = CurNode; SumNode->next->val += up; return SumNode; } };
代码思路简单解答:
因为两个链表对应的位求和,需要着重注意的就是进位。在这里的实现使用的是递进的思想,需要考虑的情况比较多,但是leetcode有个好处就是帮你把所有的测试用例都想到了,依照测试结果不断修改程序就行了。注意的是不要破坏程序的架构。
相关文章推荐
- Leetcode002--单链表两数相加
- leetcode算法题:两数相加(Java实现-效率超过100%提交者)
- LeetCode 02. 两数相加(链表) 03.最大不重复的字符串
- [Leetcode]Add Two Numbers 链表实现大数字相加
- C++链表实现多项式相加
- 编程集训第2天:LeetCode--环形链表2(142)及单链表反转(206)C++和python代码实现
- LeetCode-2. Add Two Numbers(链表实现数字相加)
- Leetcode 第二题,两数链表相加
- 链表:链表两数相加( LeetCode 2. Add Two Numbers(两数相加))
- lc#2使用链表实现两数相加
- Leetcode-java实现-002(链表相加)
- 用单链表实现一元多项式相加 C++代码
- LeetCode 2 两数相加(链表)
- leetcode之24. Swap Nodes in Pairs(C++实现&链表实现和整体测试)
- C++实现双链表
- [150420][C++]数据结构复习——链表实现源码
- 利用c++模板实现单链表
- C++实现有哨兵的双向循环链表
- 从尾到头打印链表(C++和Python 实现)
- C++实现单向链表