题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
// 先完成一个函数,作用是可以将两个升序链表合并成一个升序链表
ListNode* merge(ListNode* x, ListNode* y) {
    ListNode* node = new ListNode(0);
    ListNode* list = node;
    if (x == nullptr || y == nullptr) {
        if (x == nullptr && y == nullptr) {
            return nullptr;
        }
        if (x == nullptr) {
            return y;
        }
        if (y == nullptr) {
            return x;
        }
    }
    while (x != nullptr || y != nullptr) {
        //这里不用对x和y都为nullptr进行判断的原因是总有一方先结束,一起为nullptr不可能
        if (x == nullptr) {
            list->next=y;
            return node->next;
        }
        if (y == nullptr) {
            list->next=x;
            return node->next;
        }
        // 测试函数是否work的时候发现了这个问题,程序运行到这里总是发生段错误
        // 在if里不能光是写判断大小x->val < y->val,因为有可能x或者y经过上面操作后已经有一方是nullptr,然后判断又指向val,那肯定会报错啊!
        // 所以在进行判断时要加上判断它们是否为nullptr的条件,还有一点就是我这里的连接符是&&,只要x或者y为nullptr,即使x->val 或者y->val 是错误的,也不会报错!
        if (x!=nullptr && y!=nullptr&&(x->val < y->val)) {
            ListNode* pnextx = x->next;
            list->next = x;
            x->next = nullptr;
            list = list->next;
            x = pnextx;
        }
        // x!=nullptr && y!=nullptr&&(x->val >= y->val) 正确的
        // (x->val >= y->val)&&x!=nullptr && y!=nullptr 错误的
        // 我人嘛了,没想到if中如果有&&的话,是从左往右执行的,如果左项为false,右项即使有语法错误也不会执行
        // 不过还好当时我故意调整了一下左项与右项的位置,学到了新知识,虽然找bug找了很久(得谢谢自己!)
        if (x!=nullptr && y!=nullptr&&(x->val >= y->val)) {
            ListNode* pnexty = y->next;
            list->next = y;
            y->next = nullptr;
            list = list->next;
            y = pnexty;
        }
    }
    return node->next;
}
class Solution {
  public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // test function weather works or not!!!
        // ListNode* test=merge(lists[0], lists[1]);
        // while (test!=nullptr) {
        //     cout << test->val << '\t' << endl;
        //     test=test->next;
        // }
        // return test;
        if (lists.size()==0) {
            return nullptr;
        }
        int count=lists.size();
        while (count!=1) {
            lists[lists.size()-2]=merge(lists[lists.size()-1], lists[lists.size()-2]);
            lists.pop_back();
            count=lists.size();
        }
        return lists[0];
    }
};

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务