题解 | 链表相加(二)

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        stack<int>st1;
        stack<int>st2;
        while(head1)
        {
            st1.push(head1->val);
            head1 = head1->next;
        }
        while(head2)
        {
            st2.push(head2->val);
            head2 = head2->next;
        }
        //
        int jin = 0, v = 0;
        ListNode* pre = nullptr;
        ListNode* t_node;
        while(!st1.empty() && !st2.empty())
        {
            int v1 = st1.top();            
            int v2 = st2.top();
            st1.pop(); st2.pop();
            v1 += (v2+jin);
            if(v1>=10) jin = 1;
            else jin = 0;
            v = v1%10;
            t_node = new ListNode(v);
            t_node->next = pre;
            pre = t_node;            
        }
        if(st1.empty() && st2.empty())
        {
            if(jin == 0) ;
            else{
                t_node = new ListNode(1);
                t_node->next = pre;
            }
            return t_node;
        } 
	  // st指向还有元素的栈,用于简化后面的代码
        stack<int>st;
        if(st1.empty()) st = st2;
        else st = st1;
        while(!st.empty())
        {
            int val = st.top(); st.pop();
            val += jin;
            if(val >= 10) jin = 1;
            else jin = 0;
            val %= 10;
            t_node = new ListNode(val);
            t_node -> next = pre;
            pre = t_node;
        }
        if(jin == 1)
        {
            t_node = new ListNode(1);
            t_node->next = pre;
        }
        return t_node;
    }
};

思路:链表末尾元素最后访问,但是加法运算中最先处理,后进先出想到用栈来模拟。

易错点:“最后一次进位”不能漏了处理,无论是两个链表长度相等,还是长度有差异,在处理完题目给链表的最后一个元素后,return结果前,还应该对进位标志符进行检验,若非零,则应新增一个值为一的节点。

后续代码可优化:本着“先完成,再完美”的原则,目前代码中尚存在不少重复的代码语句,后续可以整合成一个函数来统一。

全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务