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;//注意此返回值
    	    }
    	}
    





    

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

  • 相关阅读:
    【Vegas原创】更改Linux系统默认语言
    【Vegas原创】RMAN还原一个损坏的user表空间的数据文件
    【Vegas原创】VMWare虚拟的Linux系统下,安装VMWare的增强工具
    【Vegas原创】在线修改redo.log文件的大小
    【Vegas原创】DB和DG的切换
    [工程备案]linux平台,用第三方开源库进行网页抽取和数据解析
    各种流派的正则表达式说明以及shell正则表达式
    python 自然语言处理编码转换
    工作总结2013
    linux上配置boost手记
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4840977.html
Copyright © 2011-2022 走看看