两个链表相加


 
 
这是我之前去一家公司面试出的一道面试题,但是感觉很简单,却没有答出来,现在记录一下。两个链表的相加,这是考验java基础,数据结构基础,算法基础,以及自己的思维的最好的一道题,之前在gethut上有一道原版的英文文档的题目,但是找不到。题目大概意思就是定义了一个ListNode,然后两个ListNode相加,返回一个ListNode。这里别人写过的一个编程过程,自己还没有好好推敲,等有时间,为大家写上注释和计算过程。

Definition for singly-linked list.
   public class ListNode {
       int val;
       ListNode next;
       ListNode(int x) {
           val = x;
           next = null;
       }
   }

 
 
  public class Solution {
 13     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
 14         ListNode head=null;
 15         if(l1==null&&l2==null) return head;
 16         head=new ListNode(l1.val+l2.val);
 17         ListNode tail=head;
 18         ListNode h1=l1.next;
 19         ListNode h2=l2.next;
 20         while(h1!=null&&h2!=null)
 21         {
 22             ListNode n2=new ListNode(h1.val+h2.val);
 23             h1=h1.next;
 24             h2=h2.next;
 25             //insert into list 
 26             tail.next=n2;
 27             tail=tail.next;
 28             
 29         }
 30         // the leght is same
 31         if(h1!=null)
 32         {
 33             while(h1!=null)
 34             {
 35                 tail.next=h1;
 36                 tail=tail.next;
 37                 h1=h1.next;
 38             }
 39             
 40             
 41         }
 42         if(h2!=null)
 43         {
 44             while(h2!=null)
 45             {
 46                 tail.next=h2;
 47                 tail=tail.next;
 48                 h2=h2.next;
 49             }
 50             
 51             
 52         }
 53         //ceate a new Linklist
 54         
 55        ListNode lhead=new ListNode(-10);
 56        tail=lhead;
 57         h1=head;
 58         int s=0;
 59         while(h1.next!=null) //utli the last poit
 60         {
 61             if(h1.val+s>=10)    //is large than 10
 62             {
 63                 int t=h1.val+s;
 64                 h1.val=t%10;
 65                 s=t/10;
 66                 
 67             }
 68             else
 69             {
 70                 h1.val=h1.val+s;
 71                 s=0;  // I forget it ,so BEiJU
 72                 
 73             }
 74             //insert into list
 75             tail.next=h1;
 76             tail=tail.next;
 77             
 78             h1=h1.next;
 79             
 80             
 81             
 82         }
 83         if(h1.val+s>=10)
 84         {
 85             int t2=h1.val+s;
 86             h1.val=t2%10;
 87             s=t2/10;
 88             tail.next=h1;
 89             tail=tail.next;
 90             
 91             ListNode l4=new ListNode(s);
 92             tail.next=l4;
 93             tail=tail.next;
 94             
 95         }
 96         else
 97         {
 98             h1.val=h1.val+s;
 99             tail.next=h1;
100             tail=tail.next;
101             
102             
103         }
104         
105         return lhead.next;
106         
107     
108     }
109 }

编程者说之前的代码繁琐,没有很好的封装及重用,所以做了修改
/**
 * 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) {
        ListNode head=new ListNode(-1);
        if(l1==null&&l2==null) return head.next;
        ListNode tail=head;
        int s=0;// jin wei 

        ListNode h1=l1;
        ListNode h2=l2;
        while(h1!=null&&h2!=null)
        {
            int t=h1.val+h2.val+s;
            ListNode h3=h1.next;
                h1.val=t%10;
                s=t/10;
            h1.next=null;
            tail.next=h1;
            tail=tail.next;
            h1=h3;
            h2=h2.next;
            //insert into list 
        }
       
        // the leght is same
        ListNode h=(h1!=null)?h1:h2;
        
        if(h!=null)
        {
            while(h!=null)
            {
                int t=h.val+s;
                h.val=t%10;
                s=t/10;
                ListNode tem=h.next;
                h.next=null;
                
                tail.next=h;
                
                tail=tail.next;
                h=tem;
            }
            
            
        }
       
            if(s>0)
            {
                ListNode n=new ListNode(s);
                tail.next=n;
                tail=tail.next;
            }
    
        return head.next;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值