[LeetCode] 2.两数相加

脑壳铁了,竟然想不起来应该怎么把这一位的进位加到下一位上。

小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。

看了答案,可以重新新建一个链来记录两个头节点的相加值,然后指针再相应的往后遍历。

package leetcode;

/**
 * @author doyinana
 * @create 2020-04-08 21:06
 */
public class L2 {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur=pre;
        int carry=0;
        while(l1!=null||l2!=null){
            int x=l1==null?0:l1.val;
            int y=l2==null?0:l2.val;
            int sum=x+y+carry;

            carry=sum/10;
            sum=sum%10;
            cur.next=new ListNode(sum);

            cur=cur.next;
            if(l1!=null)l1=l1.next;
            if(l2!=null)l2=l2.next;
        }
        if(carry==1){
            cur.next=new ListNode(carry);
        }
        return pre.next;
    }
}


class ListNode{
    int val;
    ListNode next;
    ListNode(int x){
        val=x;
    }
}

 

 惊了 这个也太低了

看到更快的方法里面把/和%方法换成了减法:

 

/**
 * @author doyinana
 * @create 2020-04-08 21:06
 */
class Solution{
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur=pre;
        int carry=0;
        while(l1!=null||l2!=null){
            int x=l1==null?0:l1.val;
            int y=l2==null?0:l2.val;
            int sum=x+y+carry;
            if(sum>=10){
                sum-=10;
                carry=1;
            }else{
                carry=0;
            }
            cur.next=new ListNode(sum);
            cur=cur.next;
            if(l1!=null)l1=l1.next;
            if(l2!=null)l2=l2.next;
        }
        if(carry==1){
            cur.next=new ListNode(1);
        }
        return pre.next;
    }
}

 

posted @ 2020-04-08 21:34  doyi  阅读(99)  评论(0编辑  收藏  举报