主要是相加的过程。相加后的结果由当前两位和低位的进位组成。进位初始化为0.为了避免链表中操作的复杂性(翻转、对齐等操作还需要增加额外的代码),可以直接用StringBuilder构造两个序列。依次完成翻转、对齐、相加操作,最后把字符串中的序列还原到链表中即可。

public class Solution {
    public ListNode addInList (ListNode head1, ListNode head2) {
        StringBuilder s1 = new StringBuilder();
        StringBuilder s2 = new StringBuilder();
        ListNode p = head1;
        //构造数字序列
        while(p!=null){s1.append(p.val);p=p.next;}
        p = head2;
        while(p!=null){s2.append(p.val);p=p.next;}
        //翻转
        s1.reverse();
        s2.reverse();
        //对齐,以下两个循环至多执行一个
        while(s1.length()>s2.length())s2.append('0');
        while(s2.length()>s1.length())s1.append('0');
        int nextAdd = 0;
        for(int i=0;i<s1.length();++i){
            int temp = s1.charAt(i)-'0'+s2.charAt(i)-'0'+nextAdd;
            //进位在使用之后应当清零,避免对下一次造成影响
            nextAdd=0;
            s1.setCharAt(i,(char)(temp%10+48));
            if(temp>=10){
                nextAdd = 1;//设置进位
            }
        }
        //如果结果溢出,则解除位数上线,添加一个位
        if(nextAdd==1) s1.append('1');
        s1.reverse();
        int i=0;
        ListNode res = new ListNode(s1.charAt(i++)-'0');
        p = res;
        //还原链表
        for(i=1;i<s1.length();++i){
            p.next = new ListNode(s1.charAt(i)-'0');
            p = p.next;
        }
        return res;
    }
}