文章目录
Leetcode 2.两数相加
1.问题描述
2.解决方案
解法一:进位遍历法
代码实现方面需要注意:
1.虚拟头节点别忘了
2.如果处理两个链表长度不一样的四条语句,非常优雅,如果其中一条链表为空了,相加是设为0,遍历时就不动了,也不用指向next了
while(l1!=null||l2!=null){
int x=l1==null?0:l1.val;
int y=l2==null?0:l2.val;
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
public class lc2 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//生成一个虚拟头节点
ListNode Head = new ListNode();
ListNode t=Head;
//全局设置进位数
int carry=0;
//有一个不空就继续,如果是空了就设为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;
ListNode node=new ListNode(sum%10);
t.next=node;
t=node;
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
if(carry==1) t.next=new ListNode(1);
return Head.next;
}
}
解法二:暴力法
1.思路就是把两个链表的数都求出来,然后相加为sum,然后取sum的每个位数然后构建新链表
2.问题在于ListNode中的val必须是int,因为这是人家规定好的,但是事实上其中一个链表表示的值可能long都不够,所以没办法把一个链表代表的数求出来,只能一位一位算
3.但是这个思路是没问题而且简单粗暴的,除了超大样例没发过之外,普通样例都过了
public class lc2 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2