LeetCode|2.两数相加(Java)

给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
 * 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 temp1 = l1;
		ListNode temp2 = l2;
		long num1 = 0;
		long num2 = 0;
		int i1 = 0;
		int i2 = 0;
		while (temp1 != null) {
			num1 += temp1.val * Math.pow(10, i1);
			temp1 = temp1.next;
			i1++;
		}
		while (temp2 != null) {
			num2 += temp2.val * Math.pow(10, i2);
			temp2 = temp2.next;
			i2++;
		}
		long res = num1 + num2;
		// System.out.println(res);
		ListNode resListNode = new ListNode((int) (res%10));
		ListNode tempNode = resListNode;
		while (res >= 10) {
			res /= 10;
			tempNode.next = new ListNode((int) (res % 10));
			tempNode = tempNode.next;
		}

		return resListNode;
	}
}
这样写只能通过1560/1562个测试用例,因为long:64位整数 -9,223,372,036,854,775,808——-9,223,372,036,854,775,807
其中有一个测试用例是这样的:
输入: [2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9][5,6,4,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9,9,9,9]
输出: [-2]
预期: [7,0,8,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,4,8,6,1,4,3,9,1]

所以不能用把两个链表加数读取出来,相加之后再倒序组成链表的思想。

应该让链表对应结点相加,检查进位。

---------------------------------------

正确代码

A2两数相加.java

package LeetCode;

public class A2两数相加 {
	/**
	 * Definition for singly-linked list. public class ListNode { int val;
	 * ListNode next; ListNode(int x) { val = x; } }
	 */
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		int carry = 0; // 记录进位

		ListNode resListNode = new ListNode((l1.val + l2.val + carry) % 10); // 计算个位
		carry = (l1.val + l2.val + carry) / 10; // 计算进位
		l1 = l1.next; //指针往后移
		l2 = l2.next;
		ListNode temp = resListNode;
		while ((l1 != null) || (l2 != null) || (carry != 0)) { //两个加数当前指针和进位中只要有一个不为0,就继续计算
			temp.next = new ListNode((((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + carry) % 10);
			temp = temp.next;
			carry = (((l1 != null) ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry) / 10;
			l1 = ((l1 != null) ? (l1.next) : l1); //如果当前节点已经为空,那么指针不再后移
			l2 = ((l2 != null) ? (l2.next) : l2);

		}
		return resListNode;
	}

	public static void main(String[] args) throws NullPointerException {
		//测试用例:2->3->4  5->6->4
		ListNode l1 = new ListNode(2);
		l1.next = new ListNode(4);
		l1.next.next = new ListNode(3);
		ListNode l2 = new ListNode(5);
		l2.next = new ListNode(6);
		l2.next.next = new ListNode(4);

		// ListNode l1 = new ListNode(9);
		// ListNode l2 = new ListNode(1);
		// l2.next = new ListNode(9);
		// l2.next.next = new ListNode(9);
		// l2.next.next.next = new ListNode(9);
		// l2.next.next.next.next = new ListNode(9);
		// l2.next.next.next.next.next = new ListNode(9);
		// l2.next.next.next.next.next.next = new ListNode(9);
		// l2.next.next.next.next.next.next.next = new ListNode(9);
		// l2.next.next.next.next.next.next.next.next = new ListNode(9);
		// l2.next.next.next.next.next.next.next.next.next = new ListNode(9);
		A2两数相加 a2两数相加 = new A2两数相加();
		ListNode resListNode = a2两数相加.addTwoNumbers(l1, l2);
		//这里就打印了前三位
		System.out.println(resListNode.val + "->" + resListNode.next.val + "->" + resListNode.next.next.val);
	}
}

* 特别要注意的是在条件运算符那里一定要把整个表达式扩起来(如下所示),不然答案会出错。

temp.next = new ListNode((((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + carry) % 10);

carry = (((l1 != null) ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry) / 10;


A2两数相加ListNode.java

package LeetCode;

public class A2两数相加ListNode {
	 int val;
	 A2两数相加ListNode next;
	 A2两数相加ListNode(int x) { 
		 val = x;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值