leetcode-2 Add Two Numbers 计算两个对应的列表和问题



1.问题描写叙述:

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

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

http://www.programcreek.com/2012/12/add-two-numbers/

链表的定义:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */


这里注意考虑多种情况就可以:即考虑两个链表长度不一致,遍历完链表仍有进位的情况。


解法一:较为繁琐的分类讨论方法,避免使用


public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if((l1==null)||(l2==null))
        {
            return null;
        }
        
        int temp_val = l1.val + l2.val;
        int go = temp_val /10;
        ListNode result = new ListNode(temp_val%10); 
        l1 = l1.next;
        l2 = l2.next;
        ListNode temp = result;
        while((l1!=null)&&(l2!=null))
        {
            temp_val = l1.val + l2.val + go;
            ListNode temp2 = new ListNode(temp_val%10);
            temp.next = temp2; 
            temp = temp2;
            l1 = l1.next;
            l2 = l2.next;
            go = temp_val /10;
        }
        
        while(l1!=null)
        {
            temp_val = l1.val + go;
            ListNode temp2 = new ListNode(temp_val%10);
            temp.next = temp2; 
            temp = temp2;
            l1 = l1.next;
            go = temp_val /10;
        }
        
        while(l2!=null)
        {
            temp_val = l2.val + go;
            ListNode temp2 = new ListNode(temp_val%10);
            temp.next = temp2; 
            temp = temp2;
            l2 = l2.next;
            go = temp_val /10;
        }
        
        if(go != 0)
        {
            temp.next = new ListNode(go);
        }
        return result;
    }
}

解法二:较优的解法。但在leetcode上执行时间要劣于前者

public class Solution {
		public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	    	int carry = 0;//表示进位
	    	ListNode head = new ListNode(0);//首前节点,參照C++的尾后节点
	    	ListNode temp = head;
	    	//一直循环至将两个链表遍历全然才退出
	    	while((l1 != null)||(l2 != null))
	    	{
	    		//仅需确定和的几个因子大小就可以;
	    		int first = (l1 != null) ? l1.val : 0;//使用if语句亦可
	    		int second = (l2 != null) ? l2.val : 0;
	    		
	    		int result = first + second + carry;//每一次循环计算结果
	    		carry = result /10;
	    		ListNode pNode = new ListNode(result % 10);
	    		temp.next = pNode;
	    		temp = pNode;//准备下一循环
	    		
	    		if (l1 != null) {
					l1 = l1.next;
				}
	    		
	    		if (l2 != null) {
					l2 = l2.next;
				}
	    		
	    	}
	    	//还需考虑carray不等于0及仍有进位的情况
	    	if (carry > 0)
	    	{
	    		temp.next = new ListNode(carry);
	    	}
	    	
	    	return head.next;//注意此返回值
	    }
	}







版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-26 17:04  zfyouxi  阅读(145)  评论(0编辑  收藏  举报