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;
}