【LeetCode】2.两数相加

两数相加

  • 题目描述
  • 思路
  • C++代码

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。每个结点都包含一个数字,并且数字按位逆序存储。

【LeetCode】2.两数相加_第1张图片
【LeetCode】2.两数相加_第2张图片
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-xiang-jia-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

C++代码

#include
#include

using namespace std;

// Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

// 两数通过列表的形式相加
ListNode* addTwoNumbers(ListNode* &l1, ListNode* &l2)
{
    ListNode* dummyHead = new ListNode(0);  // 定义哑结点
    ListNode* p = l1;
    ListNode* q = l2;
    ListNode* curr = dummyHead;     
    int carry = 0;  // 保存进位状态
    while(p != nullptr || q != nullptr)         // 遍历两链表,直到两者均到达末尾
    {
        int x = (p != nullptr)? p->val : 0;     // x保存l1节点值,到末尾为0
        int y = (q != nullptr)? q->val : 0;     // y保存l2节点值,到末尾为0
        int sum = carry + x + y;
        carry = sum / 10;                       // 更新进位值
        curr->next = new ListNode(sum % 10);    // 创建下一节点
        curr = curr->next;                      // 各个指针后移
        if(p != nullptr)
            p = p->next;
        if(q != nullptr)
            q = q->next;
    }
    if(carry > 0)
        curr->next = new ListNode(carry);       // 循环后,进位值非0,创建新节点

    return dummyHead->next;                     // 返回哑结点的下一节点
}

// 数字以逆序链表存储
ListNode* createNumList(int num)
{
    ListNode* pHead = new ListNode(0);
    ListNode* curr = pHead;
    while(num != 0)
    {
        curr->next = new ListNode(num % 10);
        curr = curr->next;
        num /= 10;
    }

    return pHead->next;
}

// 打印链表中存储的数字
void printNumOfList(ListNode* l)
{
    int num = 0;
    ListNode* pNode = l;
    int temp = 1;
    while(pNode != nullptr)
    {
        num += temp * pNode->val;
        temp *= 10;
        pNode = pNode->next;
    }

    printf("%d", num);
}

// 释放链表内存
void delMemoryOfList(ListNode* l)
{
    ListNode* p = l;
    ListNode* q = nullptr;
    while (p != nullptr)
    {
        q = p->next;
        delete p;
        p = q;
    }  
}

int main()
{
    int num1 = 342;
    int num2 = 465;
    ListNode* l1 = createNumList(num1);
    ListNode* l2 = createNumList(num2);
    ListNode* l = addTwoNumbers(l1, l2);
    printNumOfList(l);
    delMemoryOfList(l);
}

你可能感兴趣的:(数据结构与算法)