leetcode:2. Add Two Numbers
来源:互联网 发布:手机自动数据连接 编辑:程序博客网 时间:2024/06/05 02:12
描述
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
思路
我最终的思路很简单,就是使用轮询链表,并相加。(见代码一)
我第一个思路是将l1,l2全部变成数字,并将这些数字相加,将结果再转变成链表返回,但是由于类型的限制,如果链表太长则没有办法相加。(见代码二)
代码
代码一
/** * 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) { int carry = 0, sum = 0; sum = l1->val + l2->val; struct ListNode* resultList = new ListNode(sum % 10); struct ListNode* cur = resultList; carry = sum / 10; l1 = l1->next; l2 = l2->next; while(l1 && l2){ sum = l1->val + l2->val + carry; carry = sum / 10; cur-> next = new ListNode(sum % 10); cur = cur->next; l1 = l1->next; l2 = l2->next; } while(l1){ sum = l1->val + carry; carry = sum / 10; cur-> next = new ListNode(sum % 10); cur = cur->next; l1 = l1->next; } while(l2){ sum = l2->val + carry; carry = sum / 10; cur-> next = new ListNode(sum % 10); cur = cur->next; l2 = l2->next; } if(!l1 && !l2 && carry){ cur-> next = new ListNode(carry); cur = cur->next; } return resultList; }};
代码二
/** * 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) { long long n1 = 0, n2 = 0, count = 0, sum = 0; while(l1){ n1 = n1 + l1->val * pow(10, count); l1 = l1->next; count++; } cout <<"n1 "<< n1<< endl; count = 0; while(l2){ n2 = n2 + l2->val * pow(10, count); cout << "n2 " << n2 << endl; l2 = l2->next; count++; } sum = n2 + n1; cout << sum << endl; struct ListNode* resultList = new ListNode(sum % 10); struct ListNode* nowList = resultList; sum /= 10; while(sum > 0){ nowList-> next = new ListNode(sum % 10); nowList = nowList->next; sum = sum / 10; cout << sum << endl; } return resultList; }};
结果
他山之玉
C++ O(n) solutioin
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { ListNode preHead(0), *p = &preHead; int extra = 0; while (l1 || l2 || extra) { int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + extra; extra = sum / 10; p->next = new ListNode(sum % 10); p = p->next; l1 = l1 ? l1->next : l1; l2 = l2 ? l2->next : l2; } return preHead.next;}
Java O(n) solution
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode ln1 = l1, ln2 = l2, head = null, node = null; int carry = 0, remainder = 0, sum = 0; head = node = new ListNode(0); while(ln1 != null || ln2 != null || carry != 0) { sum = (ln1 != null ? ln1.val : 0) + (ln2 != null ? ln2.val : 0) + carry; carry = sum / 10; remainder = sum % 10; node = node.next = new ListNode(remainder); ln1 = (ln1 != null ? ln1.next : null); ln2 = (ln2 != null ? ln2.next : null); } return head.next; }}
python O(n) solution
class Solution:# @return a ListNodedef addTwoNumbers(self, l1, l2): carry = 0 root = n = ListNode(0) while l1 or l2 or carry: v1 = v2 = 0 if l1: v1 = l1.val l1 = l1.next if l2: v2 = l2.val l2 = l2.next carry, val = divmod(v1+v2+carry, 10) n.next = ListNode(val) n = n.next return root.next
反思
思路是相近的,不过我的还不够简介。加油,基本功语言还需要加强!!!!
0 0
- [LeetCode]2.Add Two Numbers
- LeetCode 2.Add Two Numbers
- LeetCode --- 2. Add Two Numbers
- [Leetcode] 2. Add Two Numbers
- 【leetcode】2. Add Two Numbers
- leetcode 2. Add Two Numbers
- LeetCode-2.Add Two Numbers
- [leetcode] 2. Add Two Numbers
- 【LeetCode】2. Add Two Numbers
- LeetCode - 2. Add Two Numbers
- LeetCode 2.Add Two Numbers
- LeetCode 2. Add Two Numbers
- Leetcode 2. Add Two Numbers
- 2. Add Two Numbers LeetCode
- leetcode 2. Add Two Numbers
- LeetCode-2. Add Two Numbers
- LeetCode 2. Add Two Numbers
- 2. Add Two Numbers----LeetCode
- 《spring-boot学习》-06-thymeleaf详解
- Spring学习(一)加强 DI依赖注入的小案例
- HDU 6015 Skip the Class
- Linux内核介绍
- JDBC简单例子
- leetcode:2. Add Two Numbers
- Oracle存储过程-增删改查与调用
- 【MySQL】 MySQL学习之 --- C语言API总览
- socket记录
- 串口 IAP
- 《spring-boot学习》-07-spring data jpa
- faster rcnn中的roi-pooling层
- Android学习和使用广播BroadCastReceiver
- Maven项目的搭建