题解 | #链表相加(二)#

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

解题思路:

1.由于两个链表相加是从最后节点开始,链表又不能逆序,那么就翻转链表进行对应节点进行相加,得到一个新的节点

2.新节点数值范围在[0,18],此时遍历新链表,进行进位操作

3.遍历完之后可能存在最后一个节点有进位的可能,判断,如有则新建节点链接到后面

4.翻转链表

public  ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        if(head1==null || head2==null){
            return head2==null?head1:head2;
        }
        //翻转两个链表
        head1=ReverseList(head1);
        head2=ReverseList(head2);
        ListNode cur1=head1;
        ListNode cur2=head2;
        ListNode addPre=null;
        //对应位置的节点相加,和值由链表1承载
        while (cur1 !=null && cur2 !=null){
            cur1.val=cur1.val + cur2.val;
            addPre=cur1;
            cur1=cur1.next;
            cur2=cur2.next;
        }
        //如果是链表1长度更长,不用处理,如果链表2长度更长,则把后续节点拼接到链表1后面
        while (cur2 != null){
            addPre.next=cur2;
            addPre=cur2;
            cur2=cur2.next;
        }
        //对数值进行进十处理
        ListNode resultCur=head1;
        int quotient=0;
        ListNode pre=null;
        while (resultCur != null){
             int val = resultCur.val+quotient;
            if(val>=10){
                quotient = val / 10;
                resultCur.val= val % 10;
            }else {
                resultCur.val=val;
                quotient=0;
            }
            pre=resultCur;
            resultCur=resultCur.next;
        }
        //如果最后还有进数,则新建节点拼接在链表上
        if(quotient>0){
            pre.next=new ListNode(quotient);
        }
        //翻转链表
        head1 = ReverseList(head1);
        return head1;
    }

  public   ListNode ReverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode cur_next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = cur_next;
        }
        return pre;


    }

#算法#
全部评论

相关推荐

牛客969571862号:昨天捞我今天面这个,岗位一模一样,感觉就是面着玩
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务