首页 > 技术文章 > leetcode两数相加

stive-night 2020-02-10 21:07 原文

 

 

 题目描述很清楚,最容易想到的就是从前往后一次相加即可。

 题中所给的数据结构描述:

第一次的算法:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res=new ListNode(0);
        ListNode cur=res;
        int      flag = 0;
        while(l1!=null&&l2!=null)
        {
            cur.val=l1.val+l2.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            cur=cur.next;
            l1=l1.next;
            l2=l2.next;            
        }
        while(l1!=null)
        {
            cur.val=l1.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            cur=cur.next;
            l1=l1.next;   
        }
        while(l2!=null){
            cur.val=l2.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            cur=cur.next;
            l2=l2.next;
        }
        return res ;   
    }
}

其中flag为保存是否进位,初始为0。

第一次运行的结果:

 

与结果多了一个0,原因在于当节点在最后一个时,也会生成新的节点,所以会多出一个0。同时上述代码还没有考虑到最后一位如果产生进位的情况。所以,我们需要一个新的节点保存最后一个节点的前一个节点。

修改后的代码:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res=new ListNode(0);
        ListNode cur=res;
        ListNode pre=null;
        int      flag = 0;
        while(l1!=null&&l2!=null)
        {
            cur.val=l1.val+l2.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            pre=cur;
            cur=cur.next;
            l1=l1.next;
            l2=l2.next;            
        }
        while(l1!=null)
        {
            cur.val=l1.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            pre=cur;
            cur=cur.next;
            l1=l1.next;   
        }
        while(l2!=null){
            cur.val=l2.val+flag;
            flag=cur.val/10;
            cur.val=cur.val%10;
            cur.next = new ListNode(0);
            pre=cur;
            cur=cur.next;
            l2=l2.next;
        }
        
        if(flag==0)
        {
           pre.next=null;
        }else
        {
            cur.val=flag;
        }
        
        return res ;   
    }
}

结果:

 

推荐阅读