题目描述:
给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
原题给出的链表结点定义:
class ListNode {
public int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
看过答案后,修正后的,题主答案:
public class 两数之和_链表 {
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1=l1;
ListNode p2=l2;
ListNode p=new ListNode(0);
ListNode p_=p;
/**
* 存在两个难点:
* 1.如何将头结点传送出去
* 一定要设置头结点,因为如果不设置即使是有指针指向,头结点也会在此过程中迷失自我
* 因此要设置不包含实际值的头结点 就好比打蛇要先按住蛇的七寸(头结点)
* 2.如何进位
* 大于10则进位,并且当前位数为当前和10的余数(不说大家也知道,但是说了就明明白白)
* 标记下一位使其进1(模仿i=1 过程 i++的类似思想)
*/
int sum=0;
int carry=0;
for(;p1!=null||p2!=null;){
if(p1==null){
sum=p2.val+carry;
}else if(p2==null){
sum=p1.val+carry;
}else {
sum=p1.val+p2.val+carry;
}
carry=sum/10;//0 或者 1 在下一个位数进1,一定要在sum取余前,判断进位嗷
sum=sum%10;
p_.next=new ListNode(sum);
p_=p_.next;
//当两个数的位数不相等时,存在null的情况
if(p1!=null){
p1=p1.next;
}
if(p2!=null){
p2=p2.next;
}
if(p1==null&&p2==null&&carry==1){
p_.next=new ListNode(carry);
}
}
return p.next;
}
public static void main(String[] args) {
// ListNode l1=new ListNode(2);
// l1.next=new ListNode(4);
// l1.next.next=new ListNode(3);
//
// ListNode l2=new ListNode(5);
// l2.next=new ListNode(6);
// l2.next.next=new ListNode(4);
ListNode l1=new ListNode(1);
l1.next=new ListNode(8);
ListNode l2=new ListNode(0);
ListNode p=addTwoNumbers(l1,l2);
for(;p!=null;){
System.out.println(p.val);
p=p.next;
}
}
}