C++算法精讲———两数相加
·
一.链表常用的 [技巧] 和 [操作] 总结
1.链表中的常用技巧:
1.画图!!!
画图无论是在链表中,在其它的算法中也具有很强的必要性,能让我们更直观地理解链表。
2.引入虚拟"头结点"作为哨兵结点。

这样的操作1.可以便于我们处理边界情况。2.方便我们对链表进行操作。
3.不要吝啬空间,大胆定义变量。

4.快慢双指针
快慢双指针主要用于 1.判断链表有没有环形结构。2.寻找链表中环的入口。 3.找链表中倒数第 n 个结点 。
2.链表中的常用操作:
1.创建一个新结点 new:直接new新的结点就行,不必多说。
2.尾插:

3.头插:

把链表中的常见技巧和操作了解了之后,我们就要进入正式的学习链表算法之旅了~~~
二.两数相加2. 两数相加 - 力扣(LeetCode)
1.题目解析:

2.算法原理:
这道题的算法原理十分简单。解法:模拟两束相加的过程即可。

不断重复上述操作我们就可以完成,直到链表结束。
3.编写代码:
这种类型的题目强烈推荐大家先去自己上手打一遍。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//创建两个指针用于遍历两个链表
ListNode* cur1 = l1, *cur2 = l2;
//new一个虚拟头节点/新链表,记录相加后的结果
ListNode* newhead = new ListNode(0);
//创建一个尾指针,指向最后一个结点
ListNode* tail = newhead;
//记录进位
int t = 0;
//只要cur1,cur2以及进位有一个不为0就进入循环
while(cur1||cur2||t)
{
//先加上第一个链表
if(cur1)
{
t += cur1->val;
//加完之后指针后移一位
cur1 = cur1->next;
}
//再加第二个链表
if(cur2)
{
t += cur2->val;
cur2 = cur2->next;
}
//将t的个位接入新链表中
tail->next = new ListNode(t%10);
tail = tail->next;
t = t/10;
}
//由于newhead是我们new的虚拟结点,所以在结束后因该将其delete掉
tail = newhead->next;
delete newhead;
return tail;
}
};
更多推荐

所有评论(0)