java-链表实现两数相加,并用链表返回
两数相加,从尾部开始,所以,链表的头部应该是数字的尾部,依次向数字的头部串联 应该设置三个链表,两个链表用来储存需要相加的数,一个链表用来存储相加之后的结果。将链表对应位置进行相加,记录sum值,此时相加之后该位置的值应为sum%10,该位置的进位carry为sum/10,下一位置时,该位置的值为**(sum+carry)%10**,进位为**(sum+carry)/10**,所以为了方便,我们一开始就设置一个carry,并将其值设为0。 以上的想法只能满足两个数字的相同位数的情况,还应考虑一些事情,如果两个数字位数不同,相加时空出来的一方用0代替。 可以实现相加之后,考虑返回值,返回的必须是链表的头部 所以在多次相加的循环里,我们需要一个空的头部链表 在循环结束后,他可以帮我们找到数字,我们就可以依次将他们输出了 因为两个链表对应位置相加后,指针就会分别移动到下一位置,循环结束时指针在链表的尾部,但是链表只能从前往后输出。
class Solution{ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode pre = new ListNode(0);//头部链表 ListNode cur = pre; pre.next=cur;//从cur开始存储数字 int carry = 0;//开始进位设为0 while(l1 != null || l2 != null) { int x = l1 == null ? 0 : l1.val;//若l1,l2有一方为null ,则他的值改为0与另一方相加 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;//返回头节点 } }
下一篇:
【无标题】二叉链表的基本操作