【LeetCode编程学习(C语言)】2.Add Two Numbers
2016-03-29 13:54
393 查看
英文题目:You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目:给定两个链表,代表两个非负整数。整数上的数字逆序存储,每一个节点包括一个数字,使这两个整数相加,然后用链表返回。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原文链接:Add
Two Numbers
解题思路:其实这就是一个用链表实现的加法运算。如上例就是实现342+465=807的操作。因为逆序存储(如果正序存储就完全不同了),正好实现从低位往高位相加,所以计算时只需要考虑进位即可。在编程时需要考虑以下几个方面:
1.如果链表有一个为空;返回另一个链表。
2.如果链接l1和l2均不为空;此时需要两个链表中的值与进位相加。如果一个处理完另一个还有数据,加上另外一个链表中的值和进位相加即可。
3.结束时,有可能还有进位,如果有还要再开辟一个节点存储进位。
代码:
ms
虽然实现了功能,但代码较为繁琐,在看别人的代码时发现判断条件完全可以写在一个while循环里面,链接:点击打开链接,代码如下:
这样写确实简洁了很多!看来还需要多加学习。
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目:给定两个链表,代表两个非负整数。整数上的数字逆序存储,每一个节点包括一个数字,使这两个整数相加,然后用链表返回。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原文链接:Add
Two Numbers
解题思路:其实这就是一个用链表实现的加法运算。如上例就是实现342+465=807的操作。因为逆序存储(如果正序存储就完全不同了),正好实现从低位往高位相加,所以计算时只需要考虑进位即可。在编程时需要考虑以下几个方面:
1.如果链表有一个为空;返回另一个链表。
2.如果链接l1和l2均不为空;此时需要两个链表中的值与进位相加。如果一个处理完另一个还有数据,加上另外一个链表中的值和进位相加即可。
3.结束时,有可能还有进位,如果有还要再开辟一个节点存储进位。
代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode* l3 = NULL; struct ListNode* q,*tmp_l1,*tmp_l2; tmp_l1 = l1; //tmp_l1用来遍历链表l1 tmp_l2 = l2; //遍历链表l2 int up = 0; int r,add; //如果有一个是空链表 if(l1 == NULL || l2 == NULL) { return (l1 == NULL ? l2 :l1); } //如果链表均不为空 while(tmp_l1 != NULL && tmp_l2 != NULL) { struct ListNode* pnode = (struct ListNode*)malloc(sizeof(struct ListNode)); add = tmp_l1->val + tmp_l2->val + up; up = add/10; r = add%10; pnode->val = r; if(l3 == NULL) //如果处理的是第一个节点 { l3 = q = pnode; } else { q->next = pnode; q = q->next; } tmp_l1 = tmp_l1->next; tmp_l2 = tmp_l2->next; } //如果链表l1还有没处理完的数据 while(tmp_l1!=NULL) { struct ListNode* pnode = (struct ListNode*)malloc(sizeof(struct ListNode)); add = tmp_l1->val + up; up = add/10; r = add%10; pnode->val = r; q->next = pnode; q = q->next; tmp_l1 = tmp_l1->next; } //如果链表l2还有没处理完的数据 while(tmp_l2!=NULL) { struct ListNode* pnode = (struct ListNode*)malloc(sizeof(struct ListNode)); add = tmp_l2->val + up; up = add/10; r = add%10; pnode->val = r; q->next = pnode; q = q->next; tmp_l2 = tmp_l2->next; } //处理最后的进位问题 if(up > 0) { struct ListNode* pnode = (struct ListNode*)malloc(sizeof(struct ListNode)); pnode->val = up; q->next = pnode; q = q->next; } q->next = NULL; //结束指针 return l3; }LeetCode运行时间:20
ms
虽然实现了功能,但代码较为繁琐,在看别人的代码时发现判断条件完全可以写在一个while循环里面,链接:点击打开链接,代码如下:
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { // Start typing your C/C++ solution below // DO NOT write int main() function // ListNode *pResult = NULL; // ListNode **pCur = &pResult; ListNode rootNode(0); ListNode *pCurNode = &rootNode; int a = 0; while (l1 || l2) { int v1 = (l1 ? l1->val : 0); int v2 = (l2 ? l2->val : 0); int temp = v1 + v2 + a; a = temp / 10; ListNode *pNode = new ListNode((temp % 10)); pCurNode->next = pNode; pCurNode = pNode; if (l1) l1 = l1->next; if (l2) l2 = l2->next; } if (a > 0) { ListNode *pNode = new ListNode(a); pCurNode->next = pNode; } return rootNode.next; } };
这样写确实简洁了很多!看来还需要多加学习。
相关文章推荐
- C++初始化顺序
- VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
- 值得学习的C语言开源项目
- C++ STL, set用法。 待更新zzzzz
- C语言技巧:怎样把数组作为参数传递给函数?
- 复利计算C语言转java的相关代码
- C++的那些事:流与IO类
- C++类成员的初始化
- 2016第七届蓝桥杯C/C++ B组省赛第三题:凑算式
- if括号中的潜规则
- c++primer(第五版) 第十三章 拷贝控制习题答案
- C语言中的static
- 2016第七届蓝桥杯C/C++ B组省赛第二题:生日蜡烛
- C++简单的图存储
- 一组整数的全排列【C程序】
- C++异常抛出与捕获及处理
- 2016第七届蓝桥杯C/C++ B组省赛第一题:煤球数目
- C++模板快速排序和Stooge排序
- c语言把一个数组里面的部分值直接复制到另外一个数组
- Leetcode 14. Longest Common Prefix