【C++算法】51.链表_两数相加
文章目录
- 链表常见技巧和操作总结
- 1. 常用技巧
- 2. 链表中的常用操作
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
链表常见技巧和操作总结
1. 常用技巧
- 画图 --> 直观,形象,便于理解
- 引入虚拟头节点
- 便于处理边界情况
- 方便我们对链表进行操作
- 不要吝啬空间,大胆去定义变量
- 快慢双指针
- 判断链表中是否有环
- 链表中环的入口
- 找链表中倒数第n个结点
2. 链表中的常用操作
- 创建一个新结点 new
- 尾插
- 头插
题目链接:
2. 两数相加
题目描述:
解法
模拟两数相加的原理即可。
C++ 算法代码:
/**
* 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:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* cur1 = l1, *cur2 = l2; // 初始化两个指针分别指向两个链表的头节点
ListNode* newhead = new ListNode(0); // 创建一个虚拟头结点,记录最终结果
ListNode* prev = newhead; // 尾指针,用于构建结果链表
int t = 0; // 记录进位
// 循环直到两个链表都遍历完且没有进位
while(cur1 || cur2 || t)
{
// 先加上第一个链表的当前节点值
if(cur1)
{
t += cur1->val; // 累加当前节点的值
cur1 = cur1->next; // 移动到下一个节点
}
// 加上第二个链表的当前节点值
if(cur2)
{
t += cur2->val; // 累加当前节点的值
cur2 = cur2->next; // 移动到下一个节点
}
// 创建新节点,值为当前和的个位数
prev->next = new ListNode(t % 10); // 取余数作为当前位的值
prev = prev->next; // 移动尾指针
t /= 10; // 计算进位值
}
// 保存结果链表的头节点(跳过虚拟头节点)
prev = newhead->next;
delete newhead; // 释放虚拟头节点的内存
return prev; // 返回结果链表
}
};