这两道题差不多,就放在一起总结,思路都是一样,按位相加,然后再设置一个进位标志位。
需要提的就是二进制相加的这道,因为二进制是用字符串表示的,所以需要将字符串拆开,我用的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();
}
}