5.链表逆序存放两个数求和


/**
 * 两个链表存放着数字:1->2->3+1->4->5=2->6->8 321+541=862
 * 1->2->3+1->4=2->6->3  321+41=362
 * @author CL
 *
 */
public class LinkListAddNums {

	    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	    	//初始化结果链表
	        ListNode head = new ListNode(0);
	        head.next=null;
	        //t:当前链表的头节点,pre:head的前一个结点
	        ListNode t = head,pre=null; 
	        while(l1!=null||l2!=null){
	        	//val:计算两个链表对应的位置的数的和
	            int val =0;
	            if(l1!=null&&l2!=null){
	                 val = l1.val+l2.val;
	                 l2=l2.next;
	                 l1=l1.next;
	            }else{
	                if(l1==null){
	                	//l1没有节点了,val=l2的值
	                    val=l2.val;
	                    l2=l2.next;
	                }else{
	                	//同理
	                     val=l1.val;
	                     l1=l1.next;
	                }
	            }
	            //无论有没有进位都要new一个后继结点,最后最高为如果没有进位的话要处理(去除最后一个结点)
	            //建立后继结点,后继节点值为(当前结点的值+val)的进位部分
	            head.next=new ListNode((val+head.val)/10);
	            //当前结点的值是:(当前结点的值+val)的个位部分
	            head.val=(val+head.val)%10;  
	            //保存前一个结点,head指向当前结点
	            pre=head;
	            head=head.next;
	        }
	        //如果最终的进位为0,把最后的结点去掉
	        if(head.val==0){
	        	pre.next=null;
	        }
	        return t;
	    }
	    
	    public static void main(String[] args) {
			ListNode l1= new ListNode(1);
			ListNode l2= new ListNode(8);
			ListNode l3= new ListNode(3);
			l1.next=l2;
			l2.next=null;
			ListNode l4= new ListNode(0);
			ListNode l5= new ListNode(9);
			ListNode l6= new ListNode(4);
			l4.next=null;
			l5.next=null;
			l6.next=null;
			ListNode re=addTwoNumbers(l1, l4);
			while(re!=null){
				System.out.print(re.val+"-->");
				re=re.next;
			}
		}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值