Leetcode 2. Add Two Number

题目描述:

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

解析:

刚开始刷leetcode,对于很多算法方面的了解还需要训练,这道题刚开始想的比较简单,以为就是一个简单的链表相加,与之前写的多项式类似,但后来提交的过程中确实出现了不少问题,总结一下,关于两数相加大体上分为以下集中情况:

(1)、位数相等的两数相加:

如44+55,因为位数相等,则每一位直接相加即可,同时设置add存储进位,每次用(val1+val2+add)/10得到结果,同时更新进位标志。

(2)、位数相等的两数相加,结果有进位:

如55+45,当循环结束时,add位不为零,需要将add位结果输出。

(3)、位数不等的两数相加:

如89+1,因为位数不等,所以当位数较少的列表先遍历完成后,遍历另一个列表,依次将该列表中的每一位数与add相加,同时更新add值,至另一个列表遍历完成。

原始代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head=null;	//指向result头部
        ListNode result=null;
        boolean flag=false;	//标志是否为第一个值,决定result是否等于其本身
        ListNode temp1=l1;
        ListNode temp2=l2;
        int add=0;		//进位标志
        while(true){
            int num=temp1.val+temp2.val+add;
            add=num/10;
            int renum=num%10;
            ListNode temp=new ListNode(renum);
            temp1=temp1.next;
            temp2=temp2.next;
            if(flag==false){
                result=temp;
                head=result;
                flag=true;
            }else{
                result.next=temp;
                result=result.next;
            }
            if(temp1==null){
                while(temp2!=null){
                    int s=temp2.val;
                    temp2.val=(s+add)%10;
                    add=(s+add)/10;
                    result.next=temp2;
                    temp2=temp2.next;
                    result=result.next;
                }
                break;
            }
            if(temp2==null){
                while(temp1!=null){
                    int s=temp1.val;
                    temp1.val=(s+add)%10;
                    add=(s+add)/10;
                    result.next=temp1;
                    temp1=temp1.next;
                    result=result.next;
                }
                break;
            }
        }
        if(add!=0){ //最终进位标志
            ListNode last=new ListNode(add);
            result.next=last;
        }
        return head;
    }
}


总结:

这道题其实挺简单的,但是好久不刷题的原因,导致自己其实花了不少时间,最终写的代码也没好好优化,就是一个粗略的想法,但我觉得题还是要自己去想才能有进步,哪怕暂时想的没有别人写的那么好,也是自己思考的结果,得到的东西才是自己的。写这篇博客,也是希望自己能坚持下去,勿忘初心,厚积薄发。


你可能感兴趣的:(leetcode题解)