首页 > 学院 > 开发设计 > 正文

Leetcode 2 - Add Two Numbers(链表求和)

2019-11-06 06:54:42
字体:
来源:转载
供稿:网友

题意

给定两个链表,代表数字的相反次序,求这两个链表加起来的和。用链表存储结果。

思路

算法1

在原来的位置上存储,利用原来的空间,于是需要判断一下哪个链表先到终点等。

算法2

很简洁的一个写法,我们假设链表的长度相同,如果一个为空了我们认为是0。

并且,在处理头结点的时候,我们刚开始新建一个不用的头结点p,每次求和的值保存在p->next = new ListNode(val)

最后结果将p后移一位即可。

代码

algorithm 1

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* add(ListNode *l1, ListNode *l2) { ListNode *p = l1, *q = l2, *PRe1 = p, *pre2 = q; int adc = 0; while (p && q) { p->val += (q->val + adc); if (p->val >= 10) { p->val %= 10; adc = 1; } else { adc = 0; } pre1 = p; pre2 = q; p = p->next; q = q->next; } if (p && !q) { while (p && adc) { p->val += adc; if (p->val >= 10) { p->val %= 10; adc = 1; } else { adc = 0; } pre1 = p; p = p->next; } } else if (!p && q) { while (q) { q->val += adc; if (q->val >= 10) { q->val %= 10; adc = 1; } else { adc = 0; } pre1->next = q; pre1 = pre1->next; q = q->next; } } if (adc) pre1->next = new ListNode(adc); return l1; } ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { return add(l1, l2); }};

algorithm 2

/** * 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 adc = 0; ListNode *head = new ListNode(0), *p = head; while (l1 || l2 || adc) { int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + adc; adc = sum / 10; p->next = new ListNode(sum % 10); p = p->next; l1 = l1 ? l1->next : l1; l2 = l2 ? l2->next : l2; } return head->next; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表