leetcode做题总结,题目Add Two Numbers /Add Binary 2011/11/01&2012/04/02

本文介绍两种算法实现:链表相加和二进制字符串相加。链表相加通过创建新链表或复用原有链表实现进位计算;二进制字符串相加采用逐位相加及进位处理。

这两道题差不多,就放在一起总结,思路都是一样,按位相加,然后再设置一个进位标志位。

需要提的就是二进制相加的这道,因为二进制是用字符串表示的,所以需要将字符串拆开,我用的split("")但是这个方法在OJ上和本地(JDK1.8)返回的数组有出入,比如字符串是“0”,本地返回{“0”},但是OJ上返回{“”,“0”}。所以代码在OJ上AC但是本地是不对的。所以以后尽量使用charAt或者toCharArray。


Add Two Numbers:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode(0);
        ListNode s = l3;
        int sum=0,wei=0;
        while(l1!=null && l2!=null){
            sum=l1.val+l2.val+wei;
            wei=0;
            if(sum>9){
                sum=sum%10;
                wei=1;
            }else{
                wei=0;
            }
            l3.next=new ListNode(sum);
            l3=l3.next;
            l2=l2.next;
            l1=l1.next;
        }
        while(l1!=null){
            if(wei==0){
                l3.next=l1;
                break;
            }
            sum=l1.val+wei;
            wei=0;
            if(sum>9){
                sum=sum%10;
                wei=1;
            }else{
                wei=0;
            }
            l3.next=new ListNode(sum);
            l3=l3.next;
            l1=l1.next;
        }
        while(l2!=null){
            if(wei==0){
                l3.next=l2;
                break;
            }
            sum=l2.val+wei;
            wei=0;
            if(sum>9){
                sum=sum%10;
                wei=1;
            }else{
                wei=0;
            }
            l3.next=new ListNode(sum);
            l3=l3.next;
            l2=l2.next;
        }
        if(wei==1){
            l3.next=new ListNode(1);
        }
        return s.next;
    }

Add Binary:

public String addBinary(String a, String b) {
        String[] s1=a.split("");
        String[] s2=b.split("");
        int num1=s1.length-1;
        int num2=s2.length-1;
        int tp=0;
        String s3="";
        while(num1>0&&num2>0){
            if(s1[num1].equals("1")&&s2[num2].equals("1")){
                if(tp==1){
                    s3="1"+s3;
                }else{
                    s3="0"+s3;
                    tp=1;
                }
            }else if(s1[num1].equals("0")&&s2[num2].equals("0")){
                if(tp==1){
                    s3="1"+s3;
                    tp=0;
                }else{
                    s3="0"+s3;
                }
            }else{
                if(tp==1){
                    s3="0"+s3;
                    tp=1;
                }else{
                    s3="1"+s3;
                }
            }
            num1--;
            num2--;
        }
        //s3="a"+s3;
        while(num1>0){
            
            if(s1[num1].equals("1")){
                if(tp==1){
                    s3="0"+s3;
                }else{
                    s3="1"+s3;
                }
            }else{
                if(tp==1){
                    s3="1"+s3;
                    tp=0;
                }else{
                    s3="0"+s3;
                }
            }
            num1--;

        }
        while(num2>0){
            if(s2[num2].equals("1")){
                if(tp==1){
                    s3="0"+s3;
                }else{
                    s3="1"+s3;
                }
            }else{
                if(tp==1){
                    s3="1"+s3;
                    tp=0;
                }else{
                    s3="0"+s3;
                }
            }
            num2--;
        }
        if(tp==1)s3="1"+s3;
        return s3;
    }

Update 2015/08/21: 第一道题思路正确但是有不足的地方,下面的方法不需要创建开始节点和新的链表,直接使用l1。如果我们使用两个变量来记录每次的和和进位,这样就可以把三个while变成一个。


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;      
 *     }
 * }
 */
public class Solution {
    /**
     * @param l1: the first list
     * @param l2: the second list
     * @return: the sum list of l1 and l2 
     */
    public ListNode addLists(ListNode l1, ListNode l2) {
        // write your code here
        if (l1 == null)
            return l2;
        if (l2 == null)
            return l1;
        ListNode s = l1;
        ListNode end = null;
        int sum=0,wei=0;  
        while(l1!=null && l2!=null){  
            sum=l1.val+l2.val+wei;  
            wei=sum/10; 
            sum=sum%10;
            l1.val = sum;
            end = l1;
            l2=l2.next;  
            l1=l1.next; 
        }  
        while(l1!=null){  
            if(wei==0){  
                break;  
            }  
            sum=l1.val+wei;  
            wei=sum/10; 
            sum=sum%10; 
            l1.val = sum;
            l1=l1.next;  
        }
        if (l2 != null)
            end.next = l2;
        while(l2!=null){ 
            if(wei==0){
                break;  
            }  
            sum=l2.val+wei;  
            wei=sum/10; 
            sum=sum%10;
            l2.val = sum;
            end = l2;
            l2=l2.next;  
        }  
        if(wei==1){  
            end.next=new ListNode(1);  
        }
        return s;
    }
}

下面是第二题的简洁写法。


public class Solution {
    /**
     * @param a a number
     * @param b a number
     * @return the result
     */
    public String addBinary(String a, String b) {
        // Write your code here
        int m = a.length(), n = b.length();
        char[] ans = new char[Math.max(m, n) + 1];
        int p = m - 1, q = n - 1, r = ans.length - 1;
        int carry = 0;
        while (r >= 0) {
            if (p >= 0)
                ans[r] += a.charAt(p--) - '0';
            if (q >= 0)
                ans[r] += b.charAt(q--) - '0';
            int temp = ans[r] + carry;
            ans[r] = (char) (temp % 2 + '0');
            carry = temp / 2;
            r--;
        }
        if (ans[0] == '0')
            ans[0] = ' ';
        return String.valueOf(ans).trim();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值