zoukankan      html  css  js  c++  java
  • 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;//注意此返回值
    	    }
    	}
    





    

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

  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4840977.html
Copyright © 2011-2022 走看看