Leetcode两数相加详解

C++两数相加完整代码详解

首先整理下需要用到的一些知识点及关键性代码,大概如下:

主要知识点:链表创建、输出、释放内存

伪代码:

1.创建ListNode结构,并定义一个类,由L1、L2指向两条已知链表,返回类型为ListNode*;

2.定义一个虚拟节点和一个遍历节点,分别为dummy和curr;

3.将两条链表的数字相加,如出现进位情况,则定义变量carry置为1(因为9+9最高进位只能为1),

同时考虑链表遍历结束后最后位进位情况;

4.移动链表指针;

5.创建链表、打印链表、释放内存;

6.main().

分解代码

ListNode结构

struct ListNode {
      int val;  //当前结点的值
      ListNode *next;  //指向下一个结点的指针
      ListNode(int x) : val(x), next(NULL) {}  //初始化当前结点值为x,指针为空
  };

链表中指针的移动:

L1=L1->next;

链表赋值

ListNode* dummy = new ListNode();

完整代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct ListNode //构建链表结构体;
{
    int val;                                //当前节点的值;
    ListNode *next;                         //指向下一个节点的指针;
    ListNode(int x) : val(x), next(NULL) {} //初始化当前节点值为x, 指针为空;
};
class solution
{
public:
    ListNode *twoadd(ListNode *L1, ListNode *L2) //构建一个新链表;
    {
        ListNode *dummy = new ListNode(-1); //定义虚拟指针,作用占位,初始值为-1;
        ListNode *curr = dummy;             //定义遍历指针;并最初指向dummy同位置;
        int carry = 0;
        while (L1 || L2 || carry != 0) //此处将链尾进位的判断条件carry也放在循环中;
        {
            int x = L1 ? L1->val : 0; //三目运算符;
            int y = L2 ? L2->val : 0;
            int sum = x + y + carry;
            curr->next = new ListNode(sum % 10); //给curr指向的下一节点赋值;
            carry = sum / 10;
            curr = curr->next; //移动curr指针;
            if (L1)
                L1 = L1->next;
            if (L2)
                L2 = L2->next;
        }
        return dummy->next;
    }
};

//创建链表
ListNode *createListNode(vector<int> vals)
{
    ListNode *beg = nullptr;  //用于指向链表第一个值;
    ListNode *last = nullptr; //遍历链表值;
    for (auto i : vals)
    {
        if (last)
        {
            last->next = new ListNode(i);
            last = last->next;
        }
        else
        {
            beg = new ListNode(i);
            last = beg;
        }
    }
    return beg;
}

//打印链表
void printfListNode(ListNode *L)
{
    ListNode *head = L;
    while (head)
    {
        cout << head->val << " , ";
        head = head->next;
    }
    cout << endl;
}

//释放内存
void freeListNode(ListNode *L)
{
    ListNode *head = L;
    auto temp = head->next;
    delete head;
    head = temp;
}

int main()
{
    auto L1 = createListNode({2, 4, 3});
    auto L2 = createListNode({5, 6, 7});
    solution s;
    auto sum = s.twoadd(L1, L2);
    printfListNode(L1);
    printfListNode(L2);
    printfListNode(sum);
    freeListNode(L1);
    freeListNode(L2);
    freeListNode(sum);
    return 0;
}

输出结果

在这里插入图片描述

参考链接

C++之ListNode
C++操作单链表ListNode
创建一个链表
两数相加
建立链表程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值