重复习简单基础算法(四):两数之和

导读:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。


示例:
                 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
                 输出:7 -> 0 -> 8
                 原因:342 + 465 = 807
public class ListNode {
		private Integer data;
		private ListNode next ;
		public ListNode getNext() {
			return next;
		}

		public void setNext(ListNode next) {
			this.next = next;
		}

		public Integer getData() {
			return data;
		}

		public void setData(Integer data) {
			this.data = data;
		}

		@Override
		public String toString() {
			String str = "";
			if(next == null){
				
				return data + "->";
			}
			else{
				return data + "->" + next;
			}

		}	
}

public class ListNodePrint {
	private static ListNode l3 = new ListNode();
	private static ListNode test = new ListNode();
	private static ListNode last = new ListNode();
    private static int sum = 0;
	private static int ok = 0;


	public static void main(String[] args) {
		// TODO Auto-generated method stub
	       int [] n = {3,4,2};
	       int [] m = {4,8,5};
    	   ListNode l1 = new ListNode();
    	   ListNode l2 = new ListNode();
	       for(int i = n.length-1; i>=0;i--){
	    	   Insert(l1,n[i]);
	       }
	       for(int i = m.length-1; i>=0;i--){
	    	   Insert(l2 ,m[i]);
	       }
	       System.out.println(l1);
	       System.out.println(l2);
	       addTwoNumbers(l1,l2,l3);
//	       System.out.println(l3);
	       deal(l3,test);
//	       System.out.println(test);
//	       System.out.println(ok);
	       /**
	        * int []p = new int [ok]; 
	        */
	       int []lis = new int[ok];
	       findLastData(test,lis,ok);
	       for(int i = ok-1; i >= 0;i--){
	    	   Insert(last,lis[i]);
	       }
	       System.out.println(last);

	}
	/**
	 * 这个将数据插入链表中
	 * @param l1
	 * @param n
	 */

	public static void Insert(ListNode l1,int n){
		if(l1.getData() == null){
			l1.setData(Integer.valueOf(n));
		}
		else{
			if(l1.getNext() == null){
				ListNode l = new ListNode();
				l1.setNext(l);
			}
			Insert(l1.getNext(),n);
		}
	}
	
	/**
	 * 将两个链表倒序相加
	 * @param l1
	 * @param l2
	 * @return
	 */

    public static void addTwoNumbers(ListNode l1, ListNode l2,ListNode l3) {

    	if(l1.getData()!=null && l2.getData()!=null){
    		if(l3.getData() == null){
            	l3.setData(l1.getData()+l2.getData());
        		if(l1.getNext()!=null && l2.getNext()!=null){
        			addTwoNumbers(l1.getNext(),l2.getNext(),l3);
        		}
    		}
    		else{
    			if(l3.getNext() == null){
    				ListNode l = new ListNode();
    				l3.setNext(l);
    			}
    			addTwoNumbers(l1,l2,l3.getNext());
    			
    		}
    	}
	}
    private static boolean flag = false;
    public static void deal(ListNode l,ListNode l1){
    	if(l.getData()!=null){
    		if(l1.getData() == null){
      			if(l.getNext()!=null){
    	    		if(l.getNext().getData()>=10 ){
    	    			l1.setData(l.getData()+1); //如果小于10
    	    		       ok++;
    	    			if(l.getNext()!=null){
    	    				deal(l.getNext(),l1);
    	    			}
    	    			flag =true;
    	    		}
    	    		else{
    	    			if(flag = true){
    		    			l1.setData(l.getData()-10);
    		    			ok++;
    	    			}
    	    			else{
    		    			l1.setData(l.getData());
    		    			ok++;
    	    			}
    	    			flag = false;
    	    			if(l.getNext()!=null){
    	    				deal(l.getNext(),l1);
    	    			}
    	    		}
      			}
      			else{
      				if(l.getData()!=null){
        		    	l1.setData(l.getData());
        		    	ok++;
      				}
      			}
    		}
    		else{
    			if(l1.getNext() == null){
    				ListNode mo = new ListNode();
    				l1.setNext(mo);
    			}
    			deal(l,l1.getNext());
    		}
    	}
    }

    public static void findLastData(ListNode l,int[]lis,int data){
    	if(l.getData()!=null){
    		lis[sum] = l.getData();
    		sum++;
        	if(sum < ok){
            	findLastData(l.getNext(),lis,data);
        	}
    	}
    }
}



心得:很简单。这道题。超级简单。思维方式也很简单,就是要做的东西可能稍微过多!!!务必多点思考即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值