LintCode-[中等] 221. 链表求和 II
来源:互联网 发布:解压软件winrar 编辑:程序博客网 时间:2024/06/05 00:21
描述:
假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
样例:
给出 6->1->7 + 2->9->5。即,617 + 295。
返回 9->1->2。即,912 。
思路:
先分别遍历两个链表,将两个链表中的数一个一个储存到整型数组中,对比两个链表的长度,即链表所代表的数的位数,如果不同则将位数小的那个数往所在数组的后面移动直到两个数的个位对齐,然后进行加法运算,并注意加法结束后最高位是否进1。最后在把运算结果从数组中提取出来连接成链表。
C++实现
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution{public: /** * @param l1: the first list * @param l2: the second list * @return: the sum list of l1 and l2 */ ListNode *creatList(ListNode* pre, int val) { ListNode *newNode = new ListNode(val); pre->next = newNode; return newNode; } ListNode *addLists2(ListNode *l1, ListNode *l2) { // write your code here if (l1 == NULL && l2 != NULL) return l2; if (l1 != NULL && l2 == NULL) return l1; if (l1 == NULL && l2 == NULL) return NULL; int size1 = 1; int size2 = 1; int resultSize = 0; ListNode *cur1 = l1; ListNode *cur2 = l2; int num1[300] = { 0 }; int num2[300] = { 0 }; int result[300] = { 0 }; memset(num1, 0, 300); memset(num2, 0, 300); memset(result, 0, 300); if (cur1->next == NULL) { num1[0] = cur1->val; } if (cur2->next == NULL) { num2[0] = cur2->val; } while (cur1->next != NULL) { num1[size1 - 1] = cur1->val; size1++; cur1 = cur1->next; if (cur1->next == NULL) { num1[size1 - 1] = cur1->val; } } while (cur2->next != NULL) { num2[size2 - 1] = cur2->val; size2++; cur2 = cur2->next; if (cur2->next == NULL) { num2[size2 - 1] = cur2->val; } } cur1 = l1; cur2 = l2; if (size1 > size2) { for (int i = 1; i <= size2; i++) { num2[size1 - i] = num2[size2 - i]; num2[size2 - i] = 0; } int c = 0; resultSize = size1 + 1; for (int i = size1; i > 0; i--) { result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10; if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1; else c = 0; result[0] = c; } } else if (size1 < size2) { for (int i = 1; i <= size1; i++) { num1[size2 - i] = num1[size1 - i]; num1[size1 - i] = 0; } int c = 0; resultSize = size2 + 1; for (int i = size2; i > 0; i--) { result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10; if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1; else c = 0; result[0] = c; } } else if (size1 == size2) { int c = 0; resultSize = size2 + 1; for (int i = size2; i > 0; i--) { result[i] = c + (num1[i - 1] + num2[i - 1]) % 10; if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1; else c = 0; result[0] = c; } } if (result[0] == 0) { ListNode *head = new ListNode(result[1]); ListNode *curR = head; for (int i = 2; i < resultSize; i++) { ListNode *acurR = creatList(curR, result[i]); curR = acurR; } } return head; } else if (result[0] == 1) { ListNode *head = new ListNode(result[0]); ListNode *curR = head; for (int i = 1; i < resultSize; i++) { ListNode *acurR = creatList(curR, result[i]); curR = acurR; } } return head; } }};
阅读全文
0 0
- LintCode-[中等] 221. 链表求和 II
- 链表求和 II-LintCode
- lintcode(221)链表求和 II
- LintCode 链表求和
- lintcode ----链表求和
- LintCode 链表求和
- 链表求和-LintCode
- lintcode--链表求和
- LintCode:链表求和
- lintcode-链表求和
- 链表求和-LintCode
- lintcode 链表求和
- 链表求和(LintCode)
- LintCode:区间求和 II
- 区间求和 II -LintCode
- 链表求和(LintCode)
- LintCode-简单-链表求和
- LintCode之链表求和
- 反转排序、存储,模拟Queue编写
- 问题 H: 生理周期
- 易混淆概念(五)模板类与类模板
- 李白打酒
- 刚体变换
- LintCode-[中等] 221. 链表求和 II
- Linux文件系统编程 系统调用 文件复制
- 顺序栈实现机制
- pscp详解
- centos 编译 PHP5.6
- 面向对象之值传递
- 【笔记】各种锅的记录之未完待续
- 样本不均衡的解决方法
- 找合法帧