最细思路讲解,代码流程带注释^_^

两个链表生成相加链表

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

该题并无多大难度,只是需要理清楚整个的合并流程,理清楚后就是写代码优化代码的事情了
思路:

  • 1.因为需要从后向前来确定每一位的值(因为有进位值),第一个想到的结构就应该是栈,然后分别将两个链表入栈,就能够保证一直是从最后进行合并。

  • 2.分别入栈后,每次从两个栈中取出一个值,计算出进位值,并更新记录,取相加个位数创建当前节点,然后使用头插法插到头部,保存当前节点,然后循环操作

  • 3.当处理完两个链表的合并,可能存在某一个栈为空且还有进位值,则可转换成2的流程进行最后的数据处理,最后返回头结点即可

  • 好了,我们的思路已经非常清晰了,然后我们来代码实现吧,小弟能力有限,只能把代码优化到这个程度,各位大佬如果能够优化请评论提醒一下我*

    public ListNode addInList (ListNode head1, ListNode head2) {
           // write code here
           //如果有一个为空则返回另外一个值
           if(head1 == null)return head2;
           if(head2 == null)return head1;
           LinkedList<ListNode> stack1 = new LinkedList<>();
           LinkedList<ListNode> stack2 = new LinkedList<>();
           ListNode r1 = head1,r2 = head2,temp = null;
           int o = 0;
           //分别入栈
           while(r1!=null){
               stack1.addFirst(r1);
               r1 = r1.next;
           }
           while(r2!=null){
               stack2.addFirst(r2);
               r2 = r2.next;
           }
           //开始合并节点
           while(!stack1.isEmpty() && !stack2.isEmpty()){
               //初始化节点
               int num1 = stack1.pollFirst().val;
               int num2 = stack2.pollFirst().val;
               //创建当前位的节点
               ListNode node = new ListNode((num1 + num2 +o)%10);
               //更新进位值
               o = merge(num1,num2,o);
               //头插,更新最新头结点
               node.next = temp;
               temp = node;
           }
           //处理两个栈可能出现剩余的情况
           while(!stack1.isEmpty()){
               int num = stack1.pollFirst().val;
               ListNode node = new ListNode((num+o)%10);
               o = merge(num,0,o);
               node.next = temp;
               temp = node;
           }
    
           while (!stack2.isEmpty()){
               int num = stack2.pollFirst().val;
               ListNode node = new ListNode((num+o)%10);
               o = merge(num,0,o);
               node.next = temp;
               temp = node;
           }
           return temp;
       }
    
       //返回进位值
       public int merge(int num1,int num2,int o){
           return (num1 + num2 + o) / 10;
       }
全部评论
我感觉不对,栈都为空以后就停了,但会有还有进位的情况所以要判断进位是不是归零了
1 回复 分享
发布于 2021-03-03 16:05
确实存在这个问题
点赞 回复 分享
发布于 2021-08-12 17:40
反转链表时间复杂度O(n),空间复杂度O(1)
点赞 回复 分享
发布于 2021-11-16 18:03

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务