题解 | #两个链表生成相加链表#

两个链表生成相加链表

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

方案

这个代码效率不高,这我承认,但是它便于阅读以及修改、调试是真的,如果你不追求那么一点点性能上的优势,可以看一下。

效率的主要损耗在于把链表打平为数组,以及计算其长度,这些可以写为紧耦合的,不过看起来以及调试起来可能就有点头痛了。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode*  head1, ListNode* head2) {
        // 1 - 防止进位出现,先多分配一个内存
        ListNode* pHead = new ListNode(0);
        // 2 - 找一个较长的链表作为返回值
        // Hint : 较长链表为 head1
        int head1Len = 0, head2Len = 0;
        {
            // 2.1 - 先解决一下异常流
            int tmp1 = calLen(head1), tmp2 = calLen(head2);
            if(tmp1 == 0) return head2;
            if(tmp2 == 0) return head1;
            if(tmp2 > tmp1){
                swap(head2, head1);
                head1Len = tmp2;
                head2Len = tmp1;
            }else{
                head1Len = tmp1;
                head2Len = tmp2;
            }
        }
        // 3 - 将链表打平,便于操作
        vector<ListNode*> head1Buf(head1Len+1);
        vector<ListNode*> head2Buf(head2Len);
        head1Buf[0] = pHead;
        plain(head1Buf.begin()+1, head1, head1Len);
        plain(head2Buf.begin(), head2, head2Len);
        head1Buf[0]->next = head1Buf[1];
        // 4 - 核心算法,加法实现
        addOperation(head1Buf, head2Buf);
        // 5 - 分情况返回结果
        if(head1Buf[0]->val == 0){
            delete head1Buf[0];
            return head1Buf[1];
        }else{
            return head1Buf[0];
        }
    }

private:
    // 计算链表长度
    size_t calLen(ListNode* node){
        size_t ret = 0;
        while(node != nullptr){
            ret++;
            node = node->next;
        }
        return ret;
    }
    
    // 交换指针
    void swap(ListNode*& node1, ListNode*& node2){
        ListNode* tmp = node1;
        node1 = node2;
        node2 = tmp;
        return;
    }
    
    // 打平 : 链表打平为数组
    void plain(vector<ListNode*>::iterator itr, ListNode* node, size_t listLen){
        for(int i=0; i < listLen; i++){
            *itr = node;
            itr++;
            node = node->next;
        }
        return;
    }

    // 数组加法实现
    void addOperation(vector<ListNode*>& num1, vector<ListNode*>& num2){
#define VAL(x)   ((*(x))->val)
        // 1 - 获取循环的最小次数
        size_t num1Len = num1.size(), num2Len = num2.size();
        size_t loopTime = min(num1Len, num2Len);
        // 2 - 循环计算结果
        auto itr1 = num1.rbegin(), itr2 = num2.rbegin();
        for(int i=0; i<loopTime; i++){
            VAL(itr1) += VAL(itr2);
            if(VAL(itr1) >= 10){
                VAL(itr1) -= 10;
                VAL(itr1+1) += 1;
            }
            itr1++;
            itr2++;
        }
        // 3 - 异常分流流 - 计算完毕
        if(VAL(itr1) < 10) return;
        // 4 - num1 自己进行步进
        while(VAL(itr1) >= 10){
            VAL(itr1) -= 10;
            VAL(itr1+1) += 1;
            itr1++;
        }
#undef VAL
    }
};






















全部评论

相关推荐

12-20 11:26
复旦大学 Java
点赞 评论 收藏
分享
牛至超人:把哈工大,再加大加粗,看见闪闪发光的哈工大字样,面试官直接流口水
投递字节跳动等公司6个岗位
点赞 评论 收藏
分享
想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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