题解 | #两个链表相加问题#

两个链表生成相加链表

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

两个链表生成相加的链表

1.题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

2.题目分析

  • 本题的顺序与链表相加的顺序是相反的是本题的一个难点
  • 可以借助栈来存储链表的数
  • 依次把所有数字压入栈中,再依次取出相加。计算过程中需要进位的情况。
  • 注意处理前置0的情况,比如链表的长度不一样就需要加上前置0,比如937和63.做加法处理的时候就可以用栈的非空判断。

3.源代码

 import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
       ListNode  dummyHead=new ListNode(-1);
                   ListNode  cur=dummyHead;
                   int  carry=0;
                   Stack<Integer>  stack1=new  Stack();
                   Stack<Integer>  stack2=new  Stack();
                     while(head1!=null){
                         stack1.push(head1.val);
                          head1=head1.next;
                     }
                   while(head2!=null){
                         stack2.push(head2.val);
                          head2=head2.next;
                     }
          while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){
                           int  x=stack1.isEmpty()?0:stack1.pop();
                           int  y=stack2.isEmpty()?0:stack2.pop();
                           int  sum=x+y+carry;
                           carry=sum/10;
                           sum=sum%10;
                           cur.next=new ListNode(sum);
                           cur=cur.next;           
          }

        return   reverse(dummyHead.next);
    }
    ListNode  reverse(ListNode head){
          ListNode pre,cur,next;
          pre=null;
          cur=next=head;
        while(cur!=null){
              next=cur.next;
              cur.next=pre;
            pre=cur;
            cur=next;
        }
          return  pre;
    }
}

复杂度分析

  • 时间复杂度:O(max(m,n)),其中m和n分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。
  • 空间复杂度:O(m+n),其中 m 和 n 分别为两个链表的长度。空间复杂度主要取决于我们把链表内容放入栈中所用的空间。
全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
03-25 16:22
南华大学 Java
不敢追175女神:你是打了上千个招呼吧?😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务