模仿大数加法,模拟相加的过程。由于链表是从尾部开始相加的,链表只有next域,所以必须先把链表反转,做大数加法的思路,得到一个新的链表,然后将新的链表反转即可。
1.ListNode l1, ListNode l2反转。
2.模拟大数加法,得到reslian
3.反转res
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 l1, ListNode l2) {

      l1 = reverse(l1);//ListNode l1反转       l2 = reverse(l2);//ListNode l2反转        ListNode dummy = new ListNode(-1);//标记
      int carry = 0;//进位
      ListNode cur = dummy;//移动指针
      while (l1 != null || l2 != null || carry > 0) {
             //两个链表节点的值相加
          int sum = 0;
          if (l1 != null) {
              sum += l1.val;
              l1 = l1.next;
          }
          if (l2 != null) {
              sum += l2.val;
              l2 = l2.next;
          }
          sum += carry;
                
               //余数作为新节点
          ListNode newNode = new ListNode(sum % 10);
               //取整作为进位值
          carry = sum / 10;
          cur.next = newNode;
          cur = cur.next;//向后移动
      }
      return reverse(dummy.next);//得到的新链表反转
}

//反转链表(这里要很熟悉了!)
    public 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;
    }
}