leetcode.2. 两数相加
两数相加
方法一
//方法一:对齐补零法 987 + 23 = 987 + 023 = 1010
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1 = 1;//记录l1的长度
int len2 = 1;//记录l2的长度
ListNode* p = l1;
ListNode* q = l2;
while (p->next != NULL) {//获取l1的长度
len1++;
p = p->next;
}
while (q->next != NULL) {//获取l2的长度
len2++;
q = q->next;
}
if (len1 > len2) {//l1较长,在l2末尾补零
for (int i = 1; i <= len1 - len2; i++) {
q->next = new ListNode(0);
q = q->next;
}
}else {//l2较长,在l1末尾补零
for (int i = 1; i <= len2 - len1; i++) {
p->next = new ListNode(0);
p = p->next;
}
}
p = l1;
q = l2;
bool count = false;//记录进位
ListNode* l3 = new ListNode(-1);//存放结果的链表
ListNode* w = l3;//l3的移动指针
int i = 0;//记录相加结果
while (p != NULL && q != NULL) {
i = count + p->val + q->val;
w->next = new ListNode(i % 10);
count = i >= 10 ? true : false;
w = w->next;
p = p->next;
q = q->next;
}
if (count) {//若最后还有进位
w->next = new ListNode(1);
w = w->next;
}
return l3->next;
}
方法二
//方法二,不需要对齐补零
ListNode* addTwoNumbers2(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1);//存放结果的链表
ListNode* h = head;//移动指针
int sum = 0;//每个位的加和结果
bool carry = false;//进位标志
while (l1 != NULL || l2 != NULL)
{
sum = 0;
if (l1 != NULL)
{
sum += l1->val;
l1 = l1->next;
}
if (l2 != NULL)
{
sum += l2->val;
l2 = l2->next;
}
if (carry)
sum++;
h->next = new ListNode(sum % 10);
h = h->next;
carry = sum >= 10 ? true : false;
}
if (carry)
{
h->next = new ListNode(1);
}
return head->next;
}
完整代码
#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;
/**
* 单链表的定义
* Definition for singly-linked list.
*/
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
//方法一:对齐补零法 987 + 23 = 987 + 023 = 1010
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1 = 1;//记录l1的长度
int len2 = 1;//记录l2的长度
ListNode* p = l1;
ListNode* q = l2;
while (p->next != NULL)//获取l1的长度
{
len1++;
p = p->next;
}
while (q->next != NULL)//获取l2的长度
{
len2++;
q = q->next;
}
if (len1 > len2)//l1较长,在l2末尾补零
{
for (int i = 1; i <= len1 - len2; i++)
{
q->next = new ListNode(0);
q = q->next;
}
}
else//l2较长,在l1末尾补零
{
for (int i = 1; i <= len2 - len1; i++)
{
p->next = new ListNode(0);
p = p->next;
}
}
p = l1;
q = l2;
bool count = false;//记录进位
ListNode* l3 = new ListNode(-1);//存放结果的链表
ListNode* w = l3;//l3的移动指针
int i = 0;//记录相加结果
while (p != NULL && q != NULL)
{
i = count + p->val + q->val;
w->next = new ListNode(i % 10);
count = i >= 10 ? true : false;
w = w->next;
p = p->next;
q = q->next;
}
if (count)//若最后还有进位
{
w->next = new ListNode(1);
w = w->next;
}
return l3->next;
}
//方法二,不需要对齐补零
ListNode* addTwoNumbers2(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1);//存放结果的链表
ListNode* h = head;//移动指针
int sum = 0;//每个位的加和结果
bool carry = false;//进位标志
while (l1 != NULL || l2 != NULL)
{
sum = 0;
if (l1 != NULL)
{
sum += l1->val;
l1 = l1->next;
}
if (l2 != NULL)
{
sum += l2->val;
l2 = l2->next;
}
if (carry)
sum++;
h->next = new ListNode(sum % 10);
h = h->next;
carry = sum >= 10 ? true : false;
}
if (carry)
{
h->next = new ListNode(1);
}
return head->next;
}
};
int main()
{
//l1 = [2,4,3], l2 = [5,6,4]
ListNode* l1 = new ListNode(2);
ListNode* l2 = new ListNode(4);
ListNode* l3 = new ListNode(3);
l1->next = l2;
l2->next = l3;
ListNode* l4 = new ListNode(5);
ListNode* l5 = new ListNode(6);
ListNode* l6 = new ListNode(4);
l4->next = l5;
l5->next = l6;
Solution s;
ListNode* ans = s.addTwoNumbers2(l1, l4);
ListNode* cur = ans;
while (cur) {
cout << cur->val;
if (cur->next) cout << "->";
cur = cur->next;
}
cout << endl;
}
//参考add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/