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;//返回头节点
    }
}
经验分享 程序员 微信小程序 职场和发展