0
点赞
收藏
分享

微信扫一扫

力扣刷题分享 1

拾杨梅记 2022-01-08 阅读 61

学习目标:

力扣题库第二题 官方地址


学习内容:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100]0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

学习时间:

2022.1.7


学习产出:

#优化前

两次提交的结果不一样
在这里插入图片描述
在这里插入图片描述
为什么会出现两次提交结果不一样的情况呢?
仔细分析,发现第二次用时会多一些,这种方法可能在父链长度大于子链的时候,可能计算会费时一些。因为要将剩下的父链循环,然后每一次都要进行判断。

解题思路

源码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        int length1=1;
        ListNode ll1=l1;
        while(ll1.next!=null){
            length1++;
            ll1=ll1.next;
        }

        int length2=1;
        ListNode ll2=l2;
        while(ll2.next!=null){
            length2++;
            ll2=ll2.next;
        }


        if(length1>=length2){

            ll1.next=new ListNode(0,null); 
            ll1=l1;
            ll2=l2;
            for(int i=1;i<=length1;i++){
                ll1.val+=ll2.val;
                if(ll1.val>=10){
                    ll1.next.val+=1;
                    ll1.val-=10;
                }
                


                if(ll2.next==null){
                    for(int j=i;j<=length1;j++){
                        if(ll1.val>=10){
                        ll1.next.val+=1;
                        ll1.val-=10;
                        }

                        if(j==length1){
                            if(ll1.next.val==0){
                                ll1.next=null;
                                return l1;
                            }
                        }
                        ll1=ll1.next;                      
                    }
                    return l1;
                }
                ll1=ll1.next;               
                ll2=ll2.next;
            }

            return l1;
        }
        else{
            ll2.next=new ListNode(0,null);

            ll1=l1;
            ll2=l2;
            for(int i=1;i<=length2;i++){
                ll2.val+=ll1.val;
                if(ll2.val>=10){
                    ll2.next.val+=1;
                    ll2.val-=10;
                }



                if(ll1.next==null){
                    for(int j=i;j<=length2;j++){
                        if(ll2.val>=10){
                        ll2.next.val+=1;
                        ll2.val-=10;
                        }

                        if(j==length2){
                            if(ll2.next.val==0){
                                ll2.next=null;
                                return l2;
                            }
                        }
                        ll2=ll2.next;                      
                    }
                    return l2;
                }
                ll2=ll2.next;
                ll1=ll1.next;
            }
            return l2;
        }

        
        


    }
}

#优化后

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        int length1=1;
        ListNode ll1=l1;
        while(ll1.next!=null){
            length1++;
            ll1=ll1.next;
        }

        int length2=1;
        ListNode ll2=l2;
        while(ll2.next!=null){
            length2++;
            ll2=ll2.next;
        }

        ListNode longNode=new ListNode(0,null);
        ListNode shortNode=new ListNode(0,null);
        ListNode BackNode=new ListNode(0,null);  //用于返回的Node
        int longlength;
        if(length1>=length2){
            longNode=l1;
            shortNode=l2;
            longlength=length1;
            BackNode=l1;
            ll1.next=new ListNode(0,null); //因为ll1还是在l1链表的最后一位上,可以用ll1做链表延长
        }else{
            longNode=l2;
            shortNode=l1;
            longlength=length2;
            BackNode=l2;
            ll2.next=new ListNode(0,null);
        }

       for(int i=1;i<=longlength;i++){
                longNode.val+=shortNode.val;
                if(longNode.val>=10){
                    longNode.next.val+=1;
                    longNode.val-=10;
                }
                


                if(shortNode.next==null){
                    for(int j=i;j<=longlength;j++){
                        if(longNode.val>=10){
                        longNode.next.val+=1;
                        longNode.val-=10;
                        }

                        if(j==longlength){
                            if(longNode.next.val==0){
                                longNode.next=null;
                                return BackNode;
                            }
                        }
                        longNode=longNode.next;                      
                    }
                    return BackNode;
                }
                longNode=longNode.next;               
                shortNode=shortNode.next;
        }
            return BackNode;
   }
}

举报

相关推荐

0 条评论