链表相加(NC40/考察次数Top24/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表相加(NC40/考察次数Top24/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入:
[9,3,7],[6,3]
返回值:
{1,0,0,0}
(题目来自牛客网)
用C++实现如下
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
//给定两个这种链表,请生成代表两个整数相加值的结果链表。
//例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0
ListNode* addInList(ListNode* head1, ListNode* head2) {
//思路,利用栈先进后出的特点(高位先进,个位最后进,所以结果就是从个位一直加到高位)计算每一位的累加和;
stack<int> stack1, stack2;
while(head1 || head2) //直到遍历完head1和head2所有的节点,并把值
{ //push到相应的stack里面
if(head1)
{
stack1.push(head1->val);
head1 = head1->next;
}
if(head2)
{
stack2.push(head2->val);
head2 = head2->next;
}
}
ListNode *vhead = new ListNode(0); //初始化一个节点为0的空节点
int redundant=0; //定义一个整型表示进位
while(!stack1.empty() || !stack2.empty() || redundant!=0) //有的stack没有遍历完时,或者进位不为0,则需要接着干
{
int a=0, b=0; //定义整形变量a和b来分别存储提取出来的值
if(!stack1.empty())
{
a=stack1.top();
stack1.pop();
}
if(!stack2.empty())
{
b=stack2.top();
stack2.pop();
}
int sum = a+b+redundant; //对应位相加,多出的进位对结果进行取余和取进位来处理
int ans = sum%10; //对累加的结果取余,余数可以在当前位使用
redundant = sum/10; //如果大于0,就进位,进位则记录下来用于高位相加
ListNode *cur = new ListNode(ans); //创建节点
cur->next = vhead->next; //在一个节点后面加节点的方法,即要新加入节点的next等于原来节点的next,
vhead->next = cur; //然后原来的节点指向新加入的节点每次把新得到的节点更新到vhead->next中去)
}
return vhead->next;
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于链表相加(NC40/考察次数Top24/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章
删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)
删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)