链表节点数字相加(牛客TOP101.BM11, 力扣HOT100.2)

针对牛客的TOP101的BM11( 链表相加(二))和力扣的HOT100第2题(两数相加)对比分析。

BM11:

实例:

输入: [9,3,7],[6,3] 

输出: {1,0,0,0}

解析:可知,链表最后一个节点是个位,然后依次向前是百位,千位.....,我们相加都是先从个位加起,然后百位.....(中间要考虑进位),因此,采用栈的方式,利用栈的先进后出,获取链表尾部(个位),然后依次出栈相加,获得新的值,存入新的链表中(头插法),最终输出。

代码:

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) {
        // write code here
        //特殊情况
        if (head1 == null){
            return head2;

        }
        if (head2 == null){
            return head1;
        }
        //两个辅助栈
        Stack<ListNode> s1 = new Stack<>();
        Stack<ListNode> s2 = new Stack<>();

        ListNode h1 = head1;
        ListNode h2 = head2;
        //两个链表依次入栈
        while (h1!= null){
            s1.push(h1);
            h1 = h1.next;
        }
        while (h2 != null){
            s2.push(h2);
            h2 = h2.next;
        }
        //进位
        int temp = 0;

        //创建新链表,
        ListNode newHead = null;
        //当s1或s2不为空的时候
        while (!s1.isEmpty() || !s2.isEmpty()){
            int val = temp;
            if (!s1.isEmpty()){
                val += s1.pop().val;
            }
            if (!s2.isEmpty()){
                val+=s2.pop().val;
            }

            //判断进位
            temp = val/10;
            //头插法,val%10是,如果存在进位的话,应该只取个位,比如说
            //s1的值是7,s2的值是8,两者相加后,得15,因此,进位是1,而新节点的值是5
            ListNode node = new ListNode(val%10);
            node.next = newHead;
            newHead = node;


        }

        //判断第一位
        if (temp > 0){
            ListNode node = new ListNode(temp);
            node.next = newHead;
            newHead = node;
        }

        return newHead;
    }
}

力扣HOT100.2:

描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

 实例:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

解析:链表第一个节点是个位,然后依次向后是百位,千位.....。因此,我们可以不借助栈,直接用链表从一个节点进行相加,获得新的值,存入新的链表中(尾插法),最终输出。

代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //新链表,有虚拟头节点
        ListNode newHead = new ListNode(-1);

        ListNode cur = newHead;
        //进位
        int temp = 0;

        while (l1!=null || l2!=null){

            int val = temp;
            if (l1!=null){
                val+=l1.val;
                l1=l1.next;
            }

            if (l2!=null){
                val+=l2.val;
                l2=l2.next;
            }

            temp = val/10;

            ListNode node = new ListNode(val%10);
            //尾插法建立链表
            cur.next=node;
            cur = cur.next;

        }

        //判断最后一位
        if (temp > 0){
            ListNode node = new ListNode(temp);
            cur.next= node;
        }
        //输出跳过虚拟头节点
        return newHead.next;
    }

还有一位大佬用的递归解决,代码如下。

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        return add(l1,l2,0);

    }

    //递归求解每一个节点的值,bit为进位
    public ListNode add(ListNode l1,ListNode l2,int bit){
        if (l1==null && l2==null && bit == 0){
            return null;
        }

        int val = bit;
        if (l1!=null){
            val+=l1.val;
            l1=l1.next;
        }

        if (l2!=null){
            val+=l2.val;
            l2=l2.next;
        }

        ListNode node = new ListNode(val%10);
        node.next=add(l1,l2,val/10);

        return node;


    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值