题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
代码
-
方法一(失败)
也是很多人可以想到的方法,首先求出两个链表所表示的数,然后进行求和,再将结果转化为链表,返回链表。
但是忽略了链表可以无限长但是int类型只能到表示2^31-1,有一定的局限性,所以执行不会通过/** * 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) { int i = 0, j = 0; int num1 = 0, num2 = 0, sum = 0; ListNode result = new ListNode(0); ListNode temp = result; // 获取第一个数 while(true) { num1 += l1.val * Math.pow(10, i); if(l1.next == null) { break; } l1 = l1.next; i++; } // 获取第二个数 while(true) { num2 += l2.val * Math.pow(10, j); if(l2.next == null) { break; } l2 = l2.next; j++; } // 求和 sum = num1 + num2; if(sum == 0) { return result; } else { while(sum != 0){ temp.next = new ListNode(sum % 10); temp = temp.next; sum = sum / 10; } return result.next; } } } // 运行结果 执行结果: 解答错误 显示详情 输入: [9] [1,9,9,9,9,9,9,9,9,9] 输出 [0,-4,-6,-3,-8,-4,-7,-4,-1,-2] 预期结果 [0,0,0,0,0,0,0,0,0,0,1]
-
方法二
第二种方法也是既第一种方法后,又想到的一种方法,简单高效;
通过两个链表从左至右对应位依次相加,满十进一,模拟加法运算/** * 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) { ListNode dummyHead= new ListNode(0); ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; while(p != null || q != null){ int num1 = (p != null) ? p.val : 0; int num2 = (q != null) ? q.val : 0; int sum = num1 + num2 + carry; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if(p != null) p = p.next; if(q != null) q = q.next; } if(carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; } }