链表相加(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/难度中等)

链表中环的入口节点(NC3/考察次数Top17/难度中等)

合并有序链表(NC33/考察次数Top9/难度中等)

数组中相加和为0的三元组(NC54/考察次数Top30/难度中等)

链表内指定区间反转(NC21/考察次数Top55/难度中等)