给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
    请你将两个数相加,并以相同形式返回一个表示和的链表。
    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    两数相加 - 图1

    示例 1:
    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/add-two-numbers

    解题思路
    1.循环每次往后移一个指针,需要区分下是否是第一次进入循环。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    13. ListNode head = new ListNode();
    14. //进位标识
    15. int c = 0;
    16. boolean first = true;
    17. ListNode pre = null;
    18. ListNode cur;
    19. int x1 = 0;
    20. int x2 = 0;
    21. int r= 0;
    22. for(;l1!=null||l2!=null;){
    23. x1 = 0;
    24. x2 = 0;
    25. if(l1!=null){
    26. x1 = l1.val;
    27. l1=l1.next;
    28. }
    29. if(l2!=null){
    30. x2 = l2.val;
    31. l2=l2.next;
    32. }
    33. //保留的数据
    34. r = (x1+x2+c)%10;
    35. //进位
    36. c = (x1+x2+c) /10;
    37. cur= new ListNode(r);
    38. //如果是第一次进来,意味是头节点,需要特殊处理
    39. if(first) {
    40. first = false;
    41. pre = cur;
    42. head = cur;
    43. }else{
    44. //如果是后面进来的,需要将pre.next->当前节点,pre往后移一个指针。
    45. pre.next = cur;
    46. pre = pre.next;
    47. }
    48. }
    49. if(c>0){
    50. pre.next = new ListNode(c);
    51. }
    52. return head;
    53. }
    54. }

    优化代码:

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode head = null, tail = null;
            int carry = 0;
            while (l1 != null || l2 != null) {
                int n1 = l1 != null ? l1.val : 0;
                int n2 = l2 != null ? l2.val : 0;
                int sum = n1 + n2 + carry;
                if (head == null) {
                    head = tail = new ListNode(sum % 10);
                } else {
                    tail.next = new ListNode(sum % 10);
                    tail = tail.next;
                }
                carry = sum / 10;
                if (l1 != null) {
                    l1 = l1.next;
                }
                if (l2 != null) {
                    l2 = l2.next;
                }
            }
            if (carry > 0) {
                tail.next = new ListNode(carry);
            }
            return head;
        }
    }
    
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class TwoListAdd {
    
        public static List<Integer> sovle(List<Integer> list1, List<Integer> list2){
    
            List<Integer> result = new ArrayList<>();
            //进位标识
            int c = 0;
            for(int i=0;i<list1.size()||i<list2.size();i++){
                int x1 = 0;
                int x2 = 0;
                if(i<list1.size()){
                    x1 = list1.get(i);
                }
    
                if(i<list2.size()){
                    x2 = list2.get(i);
                }
                int r = (x1+x2+c)%10;
                c = (x1+x2+c) /10;
                result.add(r);
            }
            return result;
        }
    
        public static void main(String[] args) {
            List<Integer> list1 = Arrays.asList(9,2,3);
            List<Integer> list2 = Arrays.asList(2,3,4,1);
            List<Integer> list3 = TwoListAdd.sovle(list1,list2);
            for (Integer item : list3) {
                System.out.print(item+" ");
            }
        }
    }