002 Add Two Numbers [Leetcode]
2015-10-27 14:48
423 查看
题目内容:
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
今天开始进入链表专题。
题目不难,只要按照链表节点顺序相加,处理好进位即可。关于链表,这里用了几个优化的办法:
1. 使用附加头结点可以避免头结点需要单独处理的情况。
2. 进位用一个bool类型来表示,要注意处理的特殊情况包括:链表长度不一致,链表两数相加有进位,在最后一位有进位
代码如下,运行时间40ms:
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
今天开始进入链表专题。
题目不难,只要按照链表节点顺序相加,处理好进位即可。关于链表,这里用了几个优化的办法:
1. 使用附加头结点可以避免头结点需要单独处理的情况。
2. 进位用一个bool类型来表示,要注意处理的特殊情况包括:链表长度不一致,链表两数相加有进位,在最后一位有进位
代码如下,运行时间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) { // 特殊情况处理 if(l1 == NULL && l2 == NULL) return NULL; else if(l1 == NULL) return l2; else if(l2 == NULL) return l1; // 进位符 bool carry = false; // 附加头结点 ListNode *head = new ListNode(0), *curr = head; while(l1 != NULL && l2 != NULL) { curr->next = addDigit(l1->val, l2->val, carry); curr = curr->next; l1 = l1->next; l2 = l2->next; } // 让l1指向未完链表头 if(l1 == NULL) l1 = l2; while(carry && l1 != NULL) { curr->next = addDigit(l1->val, 0, carry); curr = curr->next; l1 = l1->next; } // 最高位有进位 if(carry) curr->next = new ListNode(1); // 复制剩余节点 copyList(curr, l1); // 删除附加头结点 curr = head; head = head->next; delete curr; return head; } void copyList(ListNode *l1, ListNode *l2) { while(l2 != NULL) { l1->next = new ListNode(l2->val); l1 = l1->next; l2 = l2->next; } } ListNode *addDigit(int val1, int val2, bool &carry) { int val(val1 + val2); if(carry) { ++val; carry = false; } if(val >= 10) { val -= 10; carry = true; } return new ListNode(val); } };
相关文章推荐
- 正则表达式30分钟入门教程
- Context comments
- 批处理文件中获取当前所在路径的几种方法
- 移动端的长度单位
- RO05 - 如何编写RemObjects SDK服务端 (Delphi Version)
- mysql大数据高并发处理
- jstl标签库的使用
- Oracle RAC 11.2.0.4打PSU
- CAsyncSocket详解
- 跟我一起学习windows驱动编程(引用计数、上下文空间)
- 帝都地铁隧道里的动态广告是什么原理?
- Spring MVC实现QQ第三方登录 博客分类: spring
- javascript 学习总结(四)Date对象
- 非远程重启机器
- RPM包制作
- Android圆形图片带边框
- Android带日程安排的自定义日历控件
- Spring Security教程(11)---- 使用数据库来管理资源
- 正确解读PHP获取时间错误原因
- 横线-文字-横线的html-css布局