LC445-两数相加-链表/栈/头插法

题目

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
难点

本题的主要难点在于链表中数位的顺序与我们做加法的顺序是相反的,为了逆序处理所有数位,我们可以使用:把所有数字压入栈中,再依次取出相加。
最后使用头插法记录每一位的val,返回此链表
Add a node at the front

头插法的主要步骤:
  1. 给要插入的节点赋值
ListNode curNode = new ListNode(cur);
  1. 将要插入的节点的指针域指向 即将要插入的链表的头节点(ans)
curNode.next = ans;
  1. 更新头节点,插入之后的头节点为新插入的这个节点
ans = curNode;
代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //2个链表2个栈
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();

        while(l1 != null){
            stack1.push(l1.val);
            l1 = l1.next;
        }
        while(l2 != null){
            stack2.push(l2.val);
            l2 = l2.next;
        }

        int carry = 0;
        //ListNode dummy = new ListNode(0);
        ListNode ans = null;
        //dummy.next = ans;

        while(!stack1.isEmpty() || !stack2.isEmpty() || carry > 0){
            int a = stack1.isEmpty() ? 0 : stack1.pop();
            int b = stack2.isEmpty() ? 0 : stack2.pop();
            int cur = a + b + carry;
            carry = cur/10;//取整
            cur %= 10;//取余
            ListNode curNode = new ListNode(cur);
            curNode.next = ans;
            //dummy.next = curNode;
            ans = curNode;
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值