前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >刷题记录(LeetCode 100 热题系列)

刷题记录(LeetCode 100 热题系列)

原创
作者头像
猎户星座1
修改2021-01-18 14:23:00
9090
修改2021-01-18 14:23:00
举报
文章被收录于专栏:Java StudyJava Study

文章谨记录自己的刷题过程,思路,仅目的用于自己的思路记录。

两数相加 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档