445. Add Two Numbers II

来源:互联网 发布:小女孩淘宝模特叫什么 编辑:程序博客网 时间:2024/05/16 15:30
  • 题目

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

  • 分析:

题意要求就是将两个数字相加,由于我们要从低位相加,但链表头相当于栈顶,所以要对原list进行逆序操作,就是一次出栈,入栈。这样是不会消费额外的内存的因为这是链表。逆序之后就可以直接相加了,考察的还是链表的出、入栈操作。

  • 代码:
 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {        int length_l1=1;        int length_l2=1;        ListNode l=new ListNode(0);        ListNode l1_reverse=new ListNode(l1.val);        while(l1.next!=null)        {            l1=l1.next;            ListNode oldfirst=l1_reverse;            l1_reverse=new ListNode(l1.val);            l1_reverse.next=oldfirst;            length_l1++;        }        ListNode l2_reverse=new ListNode(l2.val);        while(l2.next!=null)        {            l2=l2.next;            ListNode oldfirst=l2_reverse;            l2_reverse=new ListNode(l2.val);            l2_reverse.next=oldfirst;            length_l2++;        }        int jinwei=0;        int length_min=Math.min(length_l1, length_l2);        while(length_min-->0)        {             l.val=(l1_reverse.val+l2_reverse.val+jinwei)%10;             jinwei=(l1_reverse.val+l2_reverse.val+jinwei)/10;             l1_reverse=l1_reverse.next;             l2_reverse=l2_reverse.next;             ListNode l_old=l;             l=new ListNode(0);             l.next=l_old;        }        if(length_l1>length_l2)        {while(l1_reverse!=null){         l.val=(l1_reverse.val+jinwei)%10;         jinwei=(l1_reverse.val+jinwei)/10;         l1_reverse=l1_reverse.next;         ListNode l_old=l;         l=new ListNode(0);         l.next=l_old;}        }else if(length_l2>length_l1){while(l2_reverse!=null){            l.val=(l2_reverse.val+jinwei)%10;             jinwei=(l2_reverse.val+jinwei)/10;             l2_reverse=l2_reverse.next;             ListNode l_old=l;             l=new ListNode(0);             l.next=l_old;}        }        if(jinwei==1)            l.val=1;        else            l=l.next;    return l;    }

代码看起来貌似很多,但其实就是一个逆序操作,然后从低位相加,考虑进位,两个数字位数不同等边缘情况,这份代码排名还可以80%左右,可能是因为我没有直接利用java 提供的stack而是自己用链表构造的优势。再强调一下,java封装好的stack在对时间效率要求得情况下是不建议使用的。

0 0