[LeetCode] 2.两数相加
脑壳铁了,竟然想不起来应该怎么把这一位的进位加到下一位上。
小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
看了答案,可以重新新建一个链来记录两个头节点的相加值,然后指针再相应的往后遍历。
package leetcode; /** * @author doyinana * @create 2020-04-08 21:06 */ public class L2 { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode pre = new ListNode(0); ListNode cur=pre; int carry=0; while(l1!=null||l2!=null){ int x=l1==null?0:l1.val; int y=l2==null?0:l2.val; int sum=x+y+carry; carry=sum/10; sum=sum%10; cur.next=new ListNode(sum); cur=cur.next; if(l1!=null)l1=l1.next; if(l2!=null)l2=l2.next; } if(carry==1){ cur.next=new ListNode(carry); } return pre.next; } } class ListNode{ int val; ListNode next; ListNode(int x){ val=x; } }
惊了 这个也太低了
看到更快的方法里面把/和%方法换成了减法:
/** * @author doyinana * @create 2020-04-08 21:06 */ class Solution{ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode pre = new ListNode(0); ListNode cur=pre; int carry=0; while(l1!=null||l2!=null){ int x=l1==null?0:l1.val; int y=l2==null?0:l2.val; int sum=x+y+carry; if(sum>=10){ sum-=10; carry=1; }else{ carry=0; } cur.next=new ListNode(sum); cur=cur.next; if(l1!=null)l1=l1.next; if(l2!=null)l2=l2.next; } if(carry==1){ cur.next=new ListNode(1); } return pre.next; } }