一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
例如:l1 = [2,3,4], l2 = [1,2,3] 输出: [3,5,7] 解释: 234 + 123 = 753
解法思路
我们只需要对两个链表的数字进行相加用另一个链表去表示出来
1.暴力破解直接相加法
直接将链表转为数字,然后进行相加得到结果分割后置入另一个链表
该方法容易出现数据类型长度不够存在局限性
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 计算总值
long sum = toNumber(l1) + toNumber(l2);
// 将值转化为链表
String[] split = new StringBuilder(Long.toString(sum)).reverse().toString().split("");
ListNode head, tail;
head = tail = new ListNode(Integer.parseInt(split[0]));
for (int i = 1; i < split.length; i++) {
tail.next = new ListNode(Integer.parseInt(split[i]), null);
tail = tail.next;
}
return head;
}
/**
* 将链表转化为数值
* @param listNode 链表
* @return 链表表示的数值
*/
public Long toNumber(ListNode listNode) {
StringBuilder builder = new StringBuilder();
do {
builder.append(listNode.val);
listNode = listNode.next;
} while (listNode != null);
return Long.valueOf(builder.reverse().toString());
}
}
2.按照位数相加法
从个位开始依次相加(也就是链表的头部),>= 10则进一位
结果进行加入链表,如果 >=10 需要减去10 在进行加入 在下一次计算加上这进位的1
如果存在长度不一致则向后补 0 如 12 + 234 = 012 + 234 结果不会发任何变化
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int value, carry = 0;
do {
// 为null进行补零
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
value = val1 + val2 + carry;
// 判断是否进位
if (value >= 10) {
carry = 1;
value = value - 10;
} else carry = 0;
// 置入链表尾部
if (head == null) {
head = tail = new ListNode(value);
} else {
tail.next = new ListNode(value);
tail = tail.next;
}
// 准备进行下一次循环
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
} while (l1 != null || l2 != null);
// 最后一次如果还出现进位则在链表尾部补1
if (carry != 0) tail.next = new ListNode(1);
return head;
}
}
每一个解决方案的衍生都是一个思考的过程,我们不应该去一味的的追求解题刷题的速度,而是提高自己思维,探求未知。
如有不当之处望指出
闻道有先后,术业有专攻,如是而已 -- 《师说》