BM11. [两个链表生成相加链表]

alt

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295

BM11. 两个链表生成相加链表

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=295&sfm=github&channel=nowcoder

题目分析

这个题目就是翻转链表外加一个进位符号就可以搞定,另外取模和取整 / and %感受一下即可,主要考察的还是我们的细心程度
可以看图说话

alt

步骤分析

手写一个翻转链表函数,对于我们来说基本上是没有任何的难度的事情

    public ListNode reverse(ListNode head) {
    if (head == null || head.next == null)
        return head;
    ListNode pre = null;
    ListNode cur = head;
    while (cur != null) {
        ListNode next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
    }

关键设置进位符号flag,另外新开一个链表用来存储结果,由于链表存储的和我们要处理的数字顺序是逆序,我们可以先翻转两个链表

int flag = 0;
ListNode dummy = new ListNode(-1);
ListNode newHead = dummy;
head1 = reverse(head1);
head2 = reverse(head2);

第一个循环判断head1和head2同时不空的情况,获取当前位的值,以及进位值,拼接到新链表,然后指针后移

while(head1 != null && head2 != null){
            int val = (head1.val + head2.val + flag) % 10;
            flag = (head1.val + head2.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head1 = head1.next;
            head2 = head2.next;
        }

处理head1还是不为null的情况,其实可以复用上面的代码,就是head2已经空了直接将head2的相关信息删除即可;同理当head2还是不为null的情况和head1的处理方式基本上又是一致的。

while(head1 != null){
            int val = (head1.val + flag) % 10;
            flag = (head1.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head1 = head1.next;
        }
        while(head2 != null){
            int val = (head2.val + flag) % 10;
            flag = (head2.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head2 = head2.next;
        }

最后有一个点非常的重要那就是,都完成了还有关注进位,如果还有进位那么就需要将进位也放到链表中,比如 9 + 1 = 10,同时因为我们翻转了链表为了个位的方向和我们遍历的方向一致,那么我们就需将结果也翻转回去。

if(flag > 0){
            ListNode tmp = new ListNode(flag);
            newHead.next = tmp;
        }

完整题解

 public ListNode addInList (ListNode head1, ListNode head2) {
        int flag = 0;
        ListNode dummy = new ListNode(-1);
        ListNode newHead = dummy;
        head1 = reverse(head1);
        head2 = reverse(head2);
        while(head1 != null && head2 != null){
            int val = (head1.val + head2.val + flag) % 10;
            flag = (head1.val + head2.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head1 = head1.next;
            head2 = head2.next;
        }
        while(head1 != null){
            int val = (head1.val + flag) % 10;
            flag = (head1.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head1 = head1.next;
        }
        while(head2 != null){
            int val = (head2.val + flag) % 10;
            flag = (head2.val + flag) / 10;
            ListNode tmp = new ListNode(val);
            newHead.next = tmp;
            newHead = newHead.next;
            head2 = head2.next;
        }
        if(flag > 0){
            ListNode tmp = new ListNode(flag);
            newHead.next = tmp;
        }
        return reverse(dummy.next);
    }


    public ListNode reverse(ListNode head){
        if(head == null || head.next == null)
            return head;
        ListNode pre = null;
        ListNode cur = head;
        while(cur != null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }

复杂度分析

  • 时间复杂度:为链表1的长度,为链表2的长度
  • 空间复杂度:,没有使用新的额外空间

alt

#面经##题解##面试题目#
全部评论

相关推荐

压力很大,面试官全程高压,问的问题不难,但是没有任何反馈,很慌张,也无算法。实习问了20分钟,一直问我你们做的有什么用,总时长一小时1.学校都有什么课程2.spring的ioc原理以及优点3.除了解耦还知道什么?4.springboot与spring区别,二者的源码看过没?Tomcat了解嘛?有没有具体看过5.spring的bean,面试官一直在重复一个思想问我懂不懂,完全没听过6.mybatis是干什么的?ibatis用过没?平常怎么写SQL?完全不写嘛?7.设计一个分布式双十一秒杀系统(前端,网关,缓存,数据库防超卖全设计)8.怎么做限流9.缓存与数据库一致性,你做异步要用户等你嘛?10.负载均衡怎么做11.多数据中心还是单数据中心,如果出现没卖完怎么做(到这完全不会了,面试官直接说换个话题吧)12.平常读书吗?13.上过哲学课嘛?14.兴趣爱好有没有15.对ai的看法16.来深圳有问题嘛?17.为什么不考研18.上大学带给了你什么?你提升在哪里,有没有具体的例子?反问:1.现在手机都有应用市场,应用宝怎么盈利?除了手机应用市场还是有人用,现在在做跨端,微软都有合作,之后会进军mac,主要做游戏,腾讯本身就是游戏大户。2.面试表现?整体评价一下会给到反馈。面完直接变HR面,今天HR面后,已经转为录用评估了,来牛客许个愿,暑期现在还没什么面试,希望能拿个offer之后再考虑要不要留在手子吧。
nunuking:三面压力这么大吗,面试的会议约了多长时间呀
面试问题记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 大厂实习和小厂实习最大的区别是什么? #
2536次浏览 20人参与
# 参加完秋招的机械人,还参加春招吗? #
119953次浏览 761人参与
# 米连集团26产品管培生项目 #
14508次浏览 291人参与
# 牛友の3月总结 #
1951次浏览 30人参与
# 这些公司卡简历很严格 #
95211次浏览 417人参与
# 面试被问到不会的问题,你怎么应对? #
696次浏览 8人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
18853次浏览 309人参与
# 拼多多工作体验 #
52691次浏览 342人参与
# 研究所VS国企,该如何选 #
259073次浏览 2013人参与
# 通信硬件知识分享 #
48139次浏览 538人参与
# 找AI工作可以去哪些公司? #
17178次浏览 756人参与
# 从事AI岗需要掌握哪些技术栈? #
14990次浏览 852人参与
# 你做过最难的笔试是哪家公司 #
47602次浏览 763人参与
# 实习最想跑路的瞬间 #
130962次浏览 740人参与
# 金三银四,你的春招进行到哪个阶段了? #
24603次浏览 297人参与
# 说说你知道的学历厂 #
391012次浏览 1379人参与
# AI面会问哪些问题? #
36345次浏览 1081人参与
# 想给25届机械人的秋招建议 #
47745次浏览 251人参与
# 机械人避雷的岗位/公司 #
62887次浏览 395人参与
# 大厂无回复,继续等待还是奔赴小厂 #
343363次浏览 1988人参与
# 滴!实习打卡 #
814720次浏览 6858人参与
# 我心目中的理想工作是这样的 #
100878次浏览 907人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务