445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

日常水题
难点是单向链表子节点加完要找父节点,所以整一个能找到父节点的数据结构就好了。
简单的其实就是反转链表就好,两链表翻转然后从头开始加,加完返回就行。
另一种做法是栈,两个链表压栈,再从栈里取出来相加。
我的处理方式是把子节点与父节点的关系存到map里,遍历到最右的子节点。
两个子节点相加,之后从map里找到父节点,,然后重复上述操作。
以下是代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1.val == 0) {
            return l2;
        }
        HashMap<ListNode, ListNode> m1 = new HashMap<>();
        HashMap<ListNode, ListNode> m2 = new HashMap<>();
        ListNode temp1 = getListNode(l1, m1);
        ListNode temp2 = getListNode(l2, m2);
        int temp = 0;
        while (true) {
            if (temp2 != null) {
                temp1.val = temp1.val + temp2.val + temp;
            } else {
                temp1.val = temp1.val + temp;
            }
            temp = temp1.val / 10;
            temp1.val = temp1.val % 10;
            temp1 = m1.getOrDefault(temp1, new ListNode(0, temp1));
            temp2 = m2.get(temp2);
            if (temp2 == null && temp == 0) {
                if (m1.get(temp1) == null)
                    break;
            }
        }
        if (temp1.val == 0) {
            return temp1.next;
        }
        return temp1;
    }

    private ListNode getListNode(ListNode listNode, HashMap<ListNode, ListNode> map) {
        if (listNode.next == null) {
            return listNode;
        }
        do {
            map.put(listNode.next, listNode);
            listNode = listNode.next;
        } while (listNode != null && listNode.next != null);
        return listNode;
    }

水完收工

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值