java求两单链表数据之和,并返回一个结果链表

示例如下图:

解题分析

链表长度:

  1. l1>l2
  2. l1=l2
  3. l1<l2

结果链表:最后一个结点得到的值<10,结果链表的长度为l1和l2中的较大者;最后一个结点的到的值>=10;结果链表的长度为l1和l2中的较大者加1(进位)。

实现代码如下:

class Solution {
      public static int count=0;
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //head1>=head2
        ListNode head1=getLength(l1)>=getLength(l2)?l1:l2;
        ListNode head2=getLength(l1)>=getLength(l2)?l2:l1;
        //结果为长链表或长链表加一
       ListNode result=head1;
       ListNode RESULT=result;
        while(head1!=null||head2!=null){
            //head1 head2都不为空
            if(head1!=null&&head2!=null){
                //相加结果<10
                if((head1.val+head2.val+count)<10){
                  result.val=head1.val+head2.val+count;
                   result=result.next;
                   head1=head1.next;
                   head2=head2.next;
                   count=0; }  
                //结果>=10
                else if((head1.val+head2.val+count)>=10){ 
                     //不是最后一个结点
                  if(result.next!=null){
                    result.val=(head1.val+head2.val+count)%10;
                   result=result.next;
                   head1=head1.next;
                   head2=head2.next;
                   count=1;    }  
                                     
                 //结果>=10 且是最后一个结点
                else if(result.next==null){
                 result.val=(head1.val+head2.val+count)%10;
                 result.next=new ListNode(1,null);
                 count=0; 
                 break;
             }
                   
   } 
 }
            
            //head2为空,head1不为空
            else if(head2==null&&head1!=null){
                //结果<10
                if(head1.val+count<10){result.val=head1.val+count;
                                          result=result.next;
                                           head1=head1.next;
                                           count=0;}
                //结果>=10 
                else if(head1.val+count>=10){
                      //不是最后一个结点
                         if(result.next!=null){
                         result.val=(head1.val+count)%10;
                          result=result.next;
                          head1=head1.next;
                           count=1;}
                                 
                       //结果>=10 且是最后一个结点
                  else if(result.next==null){
                          result.val=(head1.val+count)%10;
                          result.next=new ListNode(1,null);
                          count=0;
                      break;
                  }
                      }  } }
      
        return RESULT;
    } 
    //获取链表长度
    public static int getLength(ListNode l){
        ListNode current=l;
        int size=0;
        while(current!=null){
            current=current.next;
           size++;
        }
        return size;
    }
    
    
}

具体实现步骤:首先定义一个获取链表长度的函数,调用该函数获取两个链表长度较大者,新建结点head1指向较大链表用于遍历;新建一个结点result=head1用于存放结果,并新建一个结点RESULT=result用于最后的返回结果,定义一个全局变量count用于存储进位.

第二步,当任意一个链表不为空时循环遍历,其中又分为两种情况:1.head1和head2都不为空;2.head2为空,head1不为空。(head1已经定义为较大者)

第三步,在第二步种每一种条件内判判断head1.val+head2.val+count的值,<10,当前结点的值就等于head1.val+head2.val+count,此时进位为0,直接遍历;>=10,需要判断是否为最后一个结点,如果是最后一个结点,新建一个值为1的结点添加到结果链表的末端,并结束当前循环(break:),如果不是最后一个结点,该结点的值为(head1.val+head2.val+count)%10,且设置进位为1,遍历直到最后一个结点。

循环逻辑

 

 

运行结果

  

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值