Lc2-俩数相加
/** * 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 * * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 * * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 * * 示例: * * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 * * 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * */ public class Lc2 { public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } /** * 借助预先指针使得遇到无指针可用时可以用预先指针 * * 此外声明俩个指针pre 与 curr,pre表示头指针,通过curr记录当前节点的值,通过pre串成链 * * 本题的思路:利用链表的每一个节点记录当前节点的值,当遍历完最长的所有节点后确定是否有进位,有则再创将一个节点加入。 * * 为什么不用数组,因为不好确定数组的长度,动态创建会增加额外空间开销 */ public static ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode pre = new ListNode(0); ListNode curr = pre; int carry = 0; while (l1 != null || l2 != null) { int x = l1 == null ? 0 : l1.val; int y = l2 == null ? 0 : l2.val; int sum = x + y + carry; carry = sum / 10; sum = sum % 10; curr.next = new ListNode(sum); curr = curr.next; l1 = l1 == null ? l1 : l1.next; l2 = l2 == null ? l2 : l2.next; } if (carry == 1) { curr.next = new ListNode(carry); } return pre.next; } /* * 数组转化成链表的小工具 */ public static ListNode convertArrayToListNode(int[] array) { ListNode root = new ListNode(array[0]);// ·生成链表的根节点,并将数组的第一个元素的值赋给链表的根节点 ListNode other = root;// ·生成另一个节点,并让other指向root节点,other在此作为一个临时变量,相当于指针 for (int i = 1; i < array.length; i++) {// ·由于已给root赋值,所以i从1开始 ListNode temp = new ListNode(array[i]);// ·每循环一次生成一个新的节点,并给当前节点赋值 other.next = temp;// ·将other的下一个节点指向生成的新的节点 other = temp;// ·将other指向最后一个节点(other的下一个节点) other=other.getNext(); } return root; } public static void main(String[] args) { int[] l1 = { 2, 4, 5 }; int[] l2 = { 5, 6, 4 }; ListNode node1 = convertArrayToListNode(l1); ListNode node2 = convertArrayToListNode(l2); ListNode res = addTwoNumbers(node1, node2); System.out.println(); } }
不恋尘世浮华,不写红尘纷扰