题目一:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
分析:这道题目是一个链表题,对链表元素相加得出一个新的链表,那么怎么能实现链表元素的相加呢?其实这和我们实现两个数相加很类似,首先应该从个位数开始,如果之和大于10则将向前进一位。
1、创建一个新的链表,用于返回最后相加和的结果,ListNode DummyNode=new ListNode(0);
2、设置一些指向链表的节点,分别指向l1,l2,DummyNode, p1=l1,p2=l2,curr=DummyNode;
3、开始遍历列表,进行求和,首先获取了l1,l2头节点的值,在进行相加 int x=(p1!=null)? p1.val:0; int y=(p2!=null)? p2.val:0; int sum=x+y+count;
4、这里的难点在于求和后的结果超过10应该怎么办?我们应该将其记录下来,然后添加到下一次求和中,如上式的sum,记录的方式为:sum=sum/10,结果是0或者1;
5、curr节点应该添加一个新的节点,并且存放所求得的和值,方式为curr.next=new ListCode(sum%10);
6、将curr,p1,p2分别向后移动指针, curr=curr.next; if(p1!=null) p1=p1.next; if(p2!=null) p2=p2.next;
7、如果在最后一轮循环中count大于1,这需要新创建一个节点 curr.next=new ListNode(count);
8、返回链表DummyNode.next,因为第一个节点为0,无意义。
具体实现过程:
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode DummyNode=new ListNode(0); ListNode p1=l1,p2=l2,curr=DummyNode; int count=0; while(p1!=null||p2!=null) { int x=(p1!=null)? p1.val:0; int y=(p2!=null)? p2.val:0; int sum=x+y+count; count=sum/10; curr.next=new ListNode(sum%10); curr=curr.next; if(p1!=null) p1=p1.next; if(p2!=null) p2=p2.next; } if(count>0) curr.next=new ListNode(count); return DummyNode.next; } }