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

链表相加(二)

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

思路一

  • 从右到左做加法,单链表遍历可以先反转链表,变为从左到右做加法;
  • 然后,反转从左到右做加法的链表,即可得到从右向左做加法的链表;
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        if(head1 == null) return head2;
        if(head2 == null) return head1;

        // 反转链表
        ListNode l1 = reverse(head1);
        ListNode l2 = reverse(head2);

        // 链表相加,方向从左到右
        ListNode res = addInList2(l1, l2);

        return reverse(res);  // 反转,变成从右到左做加法
    }

    private ListNode reverse(ListNode head){  // 反转链表
        ListNode pre = null;
        ListNode cur = head;
        while(cur != null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }

    private ListNode addInList2(ListNode head1, ListNode head2){ // 从左到右做加法
        ListNode p1 = head1, p2 = head2;
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy; // 构建新链表
        int carry = 0; // 记录进位
        while(p1 != null || p2 != null || carry > 0){
            int val = carry; // 先加上上一次的进位,可以处理链表遍历结束后,最后出现carry>0的情况
            if(p1 != null){  // 加上链表1的节点
                val += p1.val;
                p1 = p1.next;
            }
            if(p2 != null){  // 加上链表2的节点
                val += p2.val;
                p2 = p2.next;
            }
            carry = val / 10; // 进位
            val = val % 10;
            p.next = new ListNode(val); // p.next妙
            p = p.next;
        }
        return dummy.next;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务