0
点赞
收藏
分享

微信扫一扫

杂记:逆向一块FPGA核心板

f12b11374cba 2023-07-04 阅读 97

目录

1.题目

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

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:

在这里插入图片描述
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:
输入:l1 = [0], l2 = [0]
输出:[0]

提示:
链表的长度范围为 [1, 100]
0 <= node.val <= 9
输入数据保证链表代表的数字无前导 0

进阶:如果输入链表不能翻转该如何解决?

2.思路

(1)翻转链表
本题可以直接使用下面两题的代码即可,先将链表 l1 和 l2 进行翻转,然后再将它们进行相加,最后再翻转即可。

参考文章:
LeetCode_双指针_中等_2.两数相加
LeetCode_双指针_递归_简单_206.反转链表

(2)栈
如何要求不能翻转链表,那么我们可以使用栈这一数据结构来解决问题,具体来说,先将链表 l1 和 l2 中的数分别加入到 stack1 和 stack2 中,然后再按照正常的逐位相加的方式进行计算即可。

相关题目:
LeetCode_字符串_简单_415.字符串相加

3.代码实现(Java)

//思路1————翻转链表
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode r1 = reverseList(l1);
        ListNode r2 = reverseList(l2);
        ListNode r = addNumbers(r1, r2);
        return reverseList(r);
    }

    public ListNode addNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy;
        ListNode p1 = l1;
        ListNode p2 = l2;
        int carry = 0;
        while (p1 != null || p2 != null) {
            int val = carry;
            if (p1 != null) {
                val += p1.val;
                p1 = p1.next;
            }
            if (p2 != null) {
                val += p2.val;
                p2 = p2.next;
            }
            carry = val / 10;
            val %= 10;
            p.next = new ListNode(val);
            p = p.next;
        }
        if (carry == 1) {
            p.next = new ListNode(carry);
        }
        return dummy.next;
    }

    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}
//思路2————栈
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Deque<Integer> stack1 = new ArrayDeque<Integer>();
        Deque<Integer> stack2 = new ArrayDeque<Integer>();
        while (l1 != null) {
            stack1.push(l1.val);
            l1 = l1.next;
        }
        while (l2 != null) {
            stack2.push(l2.val);
            l2 = l2.next;
        }
        int carry = 0;
        ListNode res = null;
        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 = res;
            res = curnode;
        }
        return res;
    }
}
举报

相关推荐

0 条评论