文章谨记录自己的刷题过程,思路,仅目的用于自己的思路记录。
两数相加 LeetCode url (https://leetcode-cn.com/problems/add-two-numbers/)
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
输入两个链表 链表存放的数值是按照从个位到n位的 依次增大数字 ,最后输出的值是链表各个位置的数字进行相加
看题意描述到这时脑子就想到了是 归并排序中的 merge 的过程
两个排好序的数组 依次进行加入到一个数组中,因此最后两个数组合并后的的数组就是排好序的一个数组。
这个过程对比这个流程中 这个流程多了两数相加会一个进位的过程, 这个进位的数字 可以进行记录,其实每次进位的数字也就是1 。
自己首先进入的思路比较复杂: 先计算出两个链表的合sum为多少 -》 在依次按照sum 的位数来一次next 进行填充新建链表的每一个位置 -》 链表翻转
在自己实现的过程中 计算sum 的过程
ListNode list = new ListNode(0);
ListNode headNode = list;
int count = 0;
int num = 0;
while(l1 !=null && l2 !=null){
count += (l1.val + l2.val) * Math.pow(10,num++);
l1 = l1.next;
l2 = l2.next;
}
while(l1 !=null){
count += l1.val * Math.pow(10,num++);
l1 = l1.next;
}
while(l2 !=null){
count += l2.val * Math.pow(10,num++);
l2 = l2.next;
}
去依次填充的过程
while(count/10 !=0){
headNode.next = new headNode(count/Math.pow(10,--num)); // 此步骤有问题
headNode = headNode.next;
count = count%10;
}
看完LeetCode 的官方解答后,自己也发现了,可以在边遍历两个链表的时候,边进行处理,题解在描述问题时 说:最终在新链表上的位置的数为 : (l1.val + l2.val + over)%10 而进位的数字为 (l1.val + l2.val + over)/10 其实最终进位的肯定都是1 ;
这也和我原始的思路依次填充过程中的 对每一位置的去/10 和 count%10 其实是一样的。
然后在原题结的过程中,只用了一个一个while 循环就可计算出最终的值,而我在使用时 是仿照merge 的操作去使用了三个while
官方题解比较优美吧,但官方的题解在新建的数组链表的第一个指针head 时,进行了一次判断if ,这样做,我觉得仅仅是我觉得可能会增加读者书写代码时候的思路妨碍性,目的就是进行一次记录 头指针,自己的解题方案:
ListNode head = new ListNode(0);
ListNode curr = null;
curr = head;
return head.next; // 返回的时候返回的是 next 指针
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int carry = 0;
while (l1 != null || l2 != null) {
int n1 = l1 != null ? l1.val : 0;
int n2 = l2 != null ? l2.val : 0;
int sum = n1 + n2 + carry;
if (head == null) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = sum / 10;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) {
tail.next = new ListNode(carry);
}
return head;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
反思吧:
自己在解决问题时,没有想到用一个 int carry 去重复使用,去实现这个进位的标志位,自己在写代码前脑子中也没有形成(l1.val + l2.val + carry)%10 进位后的数字, 和(l1.val + l2.val + carry)/10 进位的数字模板去 作为解题的key 。
ok 下题见。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。