首页 > 试题广场 >

链表相加(二)

[编程题]链表相加(二)
  • 热度指数:210327 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:,链表任意值
要求:空间复杂度 ,时间复杂度

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

示例1

输入

[9,3,7],[6,3]

输出

{1,0,0,0}

说明

如题面解释     
示例2

输入

[0],[6,3]

输出

{6,3}

备注:


说明:本题目包含复杂数据结构ListNode,点此查看相关信息
### 思路简单,清晰易懂

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        ListNode first = new ListNode(0);
        first.next = head1;
        ListNode second = new ListNode(0);
        second.next = head2;
        ListNode re = new ListNode(0);
        first = reverse(first);
        second = reverse(second);
        int index = 0;
        while(first!=null||second!=null){
            int x = first==null?0:first.val;
            int y = second==null?0:second.val;
            int sum = x+y+index;
            ListNode temp = new ListNode(sum%10);
            if(sum>=10){
                index = 1;
            }else{
                index=0;
            }
            temp.next = re.next;
            re.next = temp;
            if(first!=null)
            first=first.next;
            if(second!=null)
            second = second.next;
        }
        if(index==1){
            ListNode temp = new ListNode(1);
            temp.next = re.next;
            re.next = temp;
        }
        return re.next;
    }
    public ListNode reverse(ListNode head){
        ListNode point = head.next;
        head.next = null;
        while(point!=null){
            ListNode temp = point.next;
            point.next = head.next;
            head.next = point;
            point=temp;
        }
        return head.next;
    } 
}


发表于 2025-02-20 11:45:49 回复(1)
public class Solution {     

    public ListNode addInList (ListNode head1, ListNode head2) {
        
        return toList(getNum(head1), getNum(head2));  //  调用自定义方法
    }

    public String getNum(ListNode head) {   // 链表 ==> String 数字
        StringBuilder num = new StringBuilder();
        while (head != null) {
            num.append(head.val);  // 使用String + 拼接会超时 !!!
            head = head.next;
        }
        return num.toString();
    }

    public ListNode toList(String s1, String s2) {  // String ==> 链表 (本质是NC1大数加法,可用BigInteger)
        ListNode head = null;
        int i = s1.length() - 1, j = s2.length() - 1, c = 0;
        while (i >= 0 || j >= 0 || c > 0) {   
            c += i >= 0 ? s1.charAt(i--) - '0' : 0;
            c += j >= 0 ? s2.charAt(j--) - '0' : 0;
            ListNode p = new ListNode(c % 10);
            p.next = head;
            head = p;
            c /= 10;
        }
        return head;
    }
}

发表于 2025-02-06 15:32:30 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        ListNode sumNode = null;
        int carry = 0;
        ListNode new1=null, new2=null;
        while(head1!=null){
            ListNode flag = new ListNode(head1.val);
            flag.next = new1;
            new1 = flag;
            head1 = head1.next;
        }
        while(head2!=null){
            ListNode flag = new ListNode(head2.val);
            flag.next = new2;
            new2 = flag;
            head2 = head2.next;
        }
        while(new1!=null&&new2!=null){
            int flag = new1.val + new2.val + carry;
            ListNode newNode = new ListNode(flag%10);
            newNode.next = sumNode;
            sumNode = newNode;
            System.out.println(sumNode.val);
            if(flag>=10){
                carry = 1;
            }else{
                carry = 0;
            }
            new1 = new1.next;
            new2 = new2.next;
        }
        while(new1!=null){
            int flag = new1.val + carry;
            ListNode newNode = new ListNode(flag%10);
            newNode.next = sumNode;
            sumNode = newNode;
             if(flag>=10){
                carry = 1;
            }else{
                carry = 0;
            }
            new1 = new1.next;
        }
        while(new2!=null){
            int flag = new2.val + carry;
            ListNode newNode = new ListNode(flag%10);
            newNode.next = sumNode;
            sumNode = newNode;
             if(flag>=10){
                carry = 1;
            }else{
                carry = 0;
            }
            new2 = new2.next;
        }
        if(carry!=0){
            ListNode newNode = new ListNode(carry);
            newNode.next = sumNode;
            sumNode = newNode;
        }
        return sumNode;
    }
}

发表于 2025-02-04 17:54:27 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

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 dummy = new ListNode(-1);
        ListNode cur = dummy;
        // 反转链表
        head1 = reverse(head1);
        head2 = reverse(head2);
        int ret = 0;
        while(head1 != null && head2 != null){
            int val = head1.val + head2.val + ret;
            ListNode node = new ListNode(val % 10);
            cur.next = node;
            cur = cur.next;
            ret = val / 10;
            head1 = head1.next;
            head2 = head2.next;
        }
        while(head1 != null){
            int val = head1.val + ret;
            ListNode node = new ListNode(val % 10);
            cur.next = node;
            cur = cur.next;
            ret = val / 10;
            head1 = head1.next;
        }
        while(head2 != null){
            int val = head2.val + ret;
            ListNode node = new ListNode(val % 10);
            cur.next = node;
            cur = cur.next;
            ret = val / 10;
            head2 = head2.next;
        }
        while(ret != 0){
            ListNode node = new ListNode(ret % 10);
            cur.next = node;
            cur = cur.next;
            ret = ret / 10;
        }
        return reverse(dummy.next);
    }

    public ListNode reverse(ListNode head){
        if(head == null) return null;
        ListNode prev = head;
        ListNode cur = head.next;
        head.next = null;
        while(cur != null){
            ListNode curNext = cur.next;
            cur.next = prev;
            prev = cur;
            cur = curNext;
        }
        return prev;
    }
}

发表于 2024-11-29 16:39:52 回复(0)
public class Solution {
    public ListNode addInList (ListNode head1, ListNode head2) {
        return reverseList(sumList(reverseList(head1), reverseList(head2)));
    }

    private ListNode reverseList(ListNode list) {
        if (list == null || list.next == null) {
            return list;
        }

        ListNode p = null;
        ListNode q = list;
        while (q != null) {
            ListNode r = q.next;
            q.next = p;
            p = q;
            q = r;
        }
        return p;
    }

    private ListNode sumList(ListNode list1, ListNode list2) {
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;

        ListNode p = list1;
        ListNode q = list2;
        int carry = 0;

        while (p != null || q != null) {
            int val = (p == null ? 0 : p.val) + (q == null ? 0 : q.val) + carry;

            carry = val / 10;
            val = val % 10;
            cur.next = new ListNode(val);
            cur = cur.next;
            p = p == null ? p : p.next;
            q = q == null ? q : q.next;
        }
        if (carry != 0) {
            cur.next = new ListNode(carry);
        }
        return dummyHead.next;
    }
}

发表于 2024-09-18 12:14:37 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        // 反转链表再相加
        ListNode rHead1 = reverseList(head1);
        ListNode rHead2 = reverseList(head2);
        int c = 0;
        ListNode vp = new ListNode(0);
        ListNode mp = vp;
        while(rHead1!=null || rHead2!=null){
            int rval1 = 0, rval2 = 0;
            if(rHead1!=null){
                rval1 = rHead1.val;
                rHead1 = rHead1.next;
            }
            if(rHead2!=null){
                rval2 = rHead2.val;
                rHead2 = rHead2.next;
            }
            int sum = rval1+rval2+c;
            c = sum>9 ? 1 : 0;
            ListNode tmp = new ListNode(c==1 ? (sum-10) : sum);
            mp.next = tmp;
            mp = mp.next;
        }
        if(c==1) mp.next = new ListNode(c);
        return reverseList(vp.next);
    }
    public ListNode reverseList(ListNode head){
        ListNode newHead = head;
        while(head.next!=null){
            ListNode preHead = newHead;
            newHead = head.next;
            head.next = head.next.next;
            newHead.next = preHead;
        }
        return newHead;
    }
}
发表于 2024-09-06 18:38:37 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here

        // 算法的时间复杂度O(N),额外空间复杂度O(N)

        // 1.先把两个链表都遍历到底,统计各自结点个数,并得到个位指针
        // 此外,分别创建一个HashMap记录某个结点的上一个结点
        if (head1 == null || head1.val == 0) {
            return head2;
        }
        if (head2 == null || head2.val == 0) {
            return head1;
        }
        int length1 = 1;
        int length2 = 1;
        ListNode cur1 = head1;
        ListNode cur2 = head2;
        HashMap<ListNode, ListNode> preNodeMap1 = new HashMap<>();
        HashMap<ListNode, ListNode> preNodeMap2 = new HashMap<>();
        // 预先把头结点及其前驱结点null存入HashMap
        preNodeMap1.put(head1, null);
        preNodeMap2.put(head2, null);
        while (cur1.next != null) {
            // cur1还不是最后一个结点
            length1++;
            // 存入结点cur1.next,及其前驱结点cur1
            preNodeMap1.put(cur1.next, cur1);
            cur1 = cur1.next;
        }
        while (cur2.next != null) {
            // cur2还不是最后一个结点
            length2++;
            // 存入结点cur2.next,及其前驱结点cur2
            preNodeMap2.put(cur2.next, cur2);
            cur2 = cur2.next;
        }
        // 此时,cur1和cur1指向了各自链表的最后一个非null结点

        // 2.两个链表同步往前遍历,直到各自的head
        ListNode result = null;
        int jinwei = 0;
        while (cur1 != null && cur2 != null) {
            // 3.创建result链表节点,对应结点相加,注意考虑进位,头插法
            int num1 = cur1.val;
            int num2 = cur2.val;
            int numResult = num1 + num2 + jinwei;
            int valResult = numResult % 10;
            jinwei = numResult / 10;
            // 头插法插入结果节点
            ListNode curResultNode = new ListNode(valResult);
            curResultNode.next = result;
            result = curResultNode;
            // cur1和cur2共同往前走一个结点
            cur1 = preNodeMap1.get(cur1);
            cur2 = preNodeMap2.get(cur2);
        }

        // 4.出了循环后,查看是否有一个链表没有走到头,让其无限加0即可
        // 以下两个while最多只会执行一个
        while (cur1 != null) {
            // 说明链表1没走到头,而链表2已经走到头了
            // 直接令num2 = 0
            int num1 = cur1.val;
            int num2 = 0;
            int numResult = num1 + num2 + jinwei;
            int valResult = numResult % 10;
            jinwei = numResult / 10;
            // 头插法插入结果节点
            ListNode curResultNode = new ListNode(valResult);
            curResultNode.next = result;
            result = curResultNode;
            // cur1往前走一个结点
            cur1 = preNodeMap1.get(cur1);
        }
        while (cur2 != null) {
            // 说明链表1已经走到头了,而链表2没走到头
            // 直接令num1 = 0
            int num1 = 0;
            int num2 = cur2.val;
            int numResult = num1 + num2 + jinwei;
            int valResult = numResult % 10;
            jinwei = numResult / 10;
            // 头插法插入结果节点
            ListNode curResultNode = new ListNode(valResult);
            curResultNode.next = result;
            result = curResultNode;
            // cur2往前走一个结点
            cur2 = preNodeMap2.get(cur2);
        }
        // 注意!此时jinwei中可能还有值!如果有的话,还需要再头插一个结点
        if (jinwei > 0) {
            // 头插法插入结果节点
            ListNode curResultNode = new ListNode(jinwei);
            curResultNode.next = result;
            result = curResultNode;
        }
        return result;
    }
}

发表于 2024-07-26 23:13:56 回复(0)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        ListNode fHead1 = fanzhuan(head1);
        ListNode fHead2 = fanzhuan(head2);
        ListNode pre = null;
        ListNode addNode = new ListNode(0);
        while (fHead1 != null && fHead2 != null) {
            ListNode resultNode = new ListNode(0);
            int value = 0; // 同级相加运算结果
            value = fHead1.val + fHead2.val + addNode.val;
            // 同级相加运算结果个位值
            resultNode.val = value % 10;
            // 同级相加运算结果十位值
            addNode.val = value / 10;
            resultNode.next = pre;
            // 输出结果
            pre = resultNode;
            fHead1 = fHead1.next;
            fHead2 = fHead2.next;
        }
        if (fHead1 == null) {
            while (fHead2 != null) {
                ListNode resultNode = new ListNode(0);
                int value = fHead2.val + addNode.val;
                // 同级相加运算结果个位值
                resultNode.val = value % 10;
                // 同级相加运算结果十位值
                addNode.val = value / 10;
                resultNode.next = pre;
                // 输出结果
                pre = resultNode;
                fHead2 = fHead2.next;
            }
            if (addNode.val != 0) {
                addNode.next = pre;
                // 输出结果
                pre = addNode;
            }

        }
        if (fHead2 == null) {
            while (fHead1 != null) {
                ListNode resultNode = new ListNode(0);
                int value = fHead1.val + addNode.val;
                // 同级相加运算结果个位值
                resultNode.val = value % 10;
                // 同级相加运算结果十位值
                addNode.val = value / 10;
                resultNode.next = pre;
                // 输出结果
                pre = resultNode;
                fHead1 = fHead1.next;
            }
            if (addNode.val != 0) {
                addNode.next = pre;
                // 输出结果
                pre = addNode;
            }
        }
        return pre;
    }
    // 链表反转
    public ListNode fanzhuan(ListNode head) {
        ListNode pre = null;
        ListNode current = head;
        while (current != null) {
            ListNode next = current.next;
            current.next = pre;
            pre = current;
            current = next;
        }
        return pre;
    }
}
发表于 2024-07-10 20:30:33 回复(0)
public ListNode addInList (ListNode head1, ListNode head2) {
        // 先反转再模拟相加
        head1 = reverse(head1, null);
        head2 = reverse(head2, null);
        ListNode vh = new ListNode(-1);
        ListNode p = head1, q = head2;
        int a1, a2, c=0, res;
        while(true){
            if (p == null) a1 = 0;
            else a1 = p.val;
            if (q == null) a2 = 0;
            else a2 = q.val;
            res = (a1+a2+c) % 10;
            c = (a1+a2+c) / 10;
           
            if (p==null && q==null && res==0) break;
            ListNode nd = new ListNode(res);
            nd.next = vh.next;
            vh.next = nd;

            if (p != null)p = p.next;
            if (q != null)q = q.next;
        }
        return vh.next;
    }

    private static ListNode reverse(ListNode cur, ListNode prev){
        if (cur == null)
            return prev;
        ListNode nxt = cur.next;
        cur.next = prev;
        return reverse(nxt, cur);
    }
发表于 2024-06-18 21:59:13 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

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 newHead1 = reverseLL(head1);
        ListNode newHead2 = reverseLL(head2);
        ListNode cur1 = newHead1;
        ListNode cur2 = newHead2;
 
        int bit = 0;
        while (cur1 != null && cur2 != null) {
            int sum = cur1.val + cur2.val;

            cur1.val = cur2.val = sum;
            cur1 = cur1.next;
            cur2 = cur2.next;
        }
        if(cur1 == null && cur2 == null) {
            reConstructLL(newHead1);
            return reverseLL(newHead1);
        }
        if (cur1 == null) {
            while (cur2.next != null) {
                cur2 = cur2.next;
            }
            reConstructLL(newHead2);
            return reverseLL(newHead2);
        }
        while (cur1.next != null) {
            cur1 = cur1.next;
        }
        reConstructLL(newHead1);
        return reverseLL(newHead1);
    }

    public static ListNode reverseLL(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            return pHead;
        }
        ListNode cur = pHead;
        ListNode prev = null;
        ListNode next = null;
        while (cur != null) {
            next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }

    private static ListNode reConstructLL(ListNode pHead) {
        if (pHead == null) {
            return pHead;
        }
        ListNode cur = pHead;
        ListNode next = null;
        while (cur.next != null) {
            next = cur.next;
            if (cur.val >= 10) {
                cur.val -= 10;
                next.val += 1;
            }
            cur = next;
        }
        if (cur.val >= 10) {
            cur.val -= 10;
            cur.next = new ListNode(1);
        }
        return pHead;
    }
}
发表于 2024-03-28 22:11:08 回复(0)
//写的太差了
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        int n1 = 0;
        int n2 = 0;
        ListNode p1 = head1;
        ListNode p2 = head2;
        while(p1 != null){
            n1++;
            p1 = p1.next;
        }
        while(p2 != null){
            n2++;
            p2 = p2.next;
        }
        int[] num1 = new int[n1];
        int[] num2 = new int[n2];
        p1 = head1;
        p2 = head2;
        for(int i = 0;i<n1;i++){
            num1[i] = p1.val;
            p1 = p1.next;
        }
        for(int i = 0;i<n2;i++){
            num2[i] = p2.val;
            p2 = p2.next;
        }
        int flag = 0;
        int sumN = 0;
        if(n1 > n2){
            sumN = n1 + 1;
        }else{
            sumN = n2 + 1;
        }
        int[] res = new int[sumN];
        n1--;
        n2--;
        sumN--;
        while(n1 >= 0 && n2 >= 0){
            int temp = num1[n1] + num2[n2] + flag;
            if(temp > 9){
                flag = 1;
                res[sumN] = temp - 10;
            }else{
                flag = 0;
                res[sumN] = temp;
            }
            sumN--;
            n1--;
            n2--;
        }
        while(n1 >= 0){
            int temp = num1[n1] + flag;
            if(temp > 9){
                flag = 1;
                res[sumN] = temp - 10;
            }else{
                flag = 0;
                res[sumN] = temp;
            }
            sumN--;
            n1--;
        }
        while(n2 >= 0){
            int temp = num2[n2] + flag;
            if(temp > 9){
                flag = 1;
                res[sumN] = temp - 10;
            }else{
                flag = 0;
                res[sumN] = temp;
            }
            sumN--;
            n2--;
        }
        if(flag == 1){
            res[sumN] = 1;
        }else{
            res[sumN] = 0;
        }
        // for(int i = 0;i<res.length;i++)
        //     System.out.print(res[i]);
        
        ListNode resHead = new ListNode(0);
        ListNode p = resHead;
        for(int i = 0;i<res.length;i++){
            ListNode temp = new ListNode(res[i]);
            p.next = temp;
            p = p.next;
        }
        while(resHead.val == 0){
            resHead = resHead.next;
        }
        return resHead;
    }
}

编辑于 2024-03-02 18:35:11 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        Stack<Integer> stack3 = new Stack<>();
        while (head1 != null) {
            stack1.push(head1.val);
            head1 = head1.next;
        }
        while (head2 != null) {
            stack2.push(head2.val);
            head2 = head2.next;
        }
        Integer flag = 0 ;
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            Integer num1 = stack1.isEmpty() ? 0 : stack1.pop();
            Integer num2 = stack2.isEmpty() ? 0 : stack2.pop();
            Integer sum = num1 + num2 + flag;
            flag = sum >= 10 ? 1 : 0;
            stack3.push(sum % 10);
        }
        ListNode pre = new ListNode(-1);
        ListNode cur = pre;
        while (!stack3.isEmpty()) {
            cur.next = new ListNode(stack3.pop());
            cur = cur.next;
        }
        if (flag == 1) {
            ListNode newHead = new ListNode(1);
            newHead.next = pre.next;
            return newHead;
        }
        return pre.next;
    }
}

编辑于 2023-12-01 15:57:15 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        // store 2 lists to 2 Arraylists
        ArrayList<Integer> num1 = new ArrayList<>();
        ArrayList<Integer> num2 = new ArrayList<>();

        ListNode curr = head1;
        while (curr != null) {
            num1.add(curr.val);
            curr = curr.next;
        }

        curr = head2;
        while(curr != null) {
            num2.add(curr.val);
            curr = curr.next;
        }

        // reverse ArrayLists, make 2 ArrayLists the same size (0 padding)
        Collections.reverse(num1);
        Collections.reverse(num2);

        int maxSize = num1.size() > num2.size() ? num1.size() : num2.size();
        if (num1.size() < maxSize) {
            for (int i = num1.size(); i < maxSize; i++) {
                num1.add(0);
            }
        } else if (num2.size() < maxSize) {
            for (int i = num2.size(); i < maxSize; i++) {
                num2.add(0);
            }
        }
    
        // add operation
        ArrayList<Integer> sumReverse = new ArrayList<>();
        boolean hasCarry = false;
        for (int i = 0; i < maxSize; i++) {
            int sum = num1.get(i) + num2.get(i);
            sum += hasCarry ? 1 : 0;

            sumReverse.add(sum % 10);
            hasCarry = sum / 10 == 1 ? true : false;
        }
        if (hasCarry) { // last bit
            sumReverse.add(1);
        }

        // store the reverse ArrayList to list
        ListNode dummy = new ListNode(-1);
        curr = dummy;
        for (int i = sumReverse.size() - 1; i >=0; i--) {
            curr.next = new ListNode(sumReverse.get(i));
            curr = curr.next;
        }

        return dummy.next;
    }
}

发表于 2023-11-17 15:45:36 回复(0)
public ListNode addInList1(ListNode head1, ListNode head2) {
        ArrayList<Integer> listNodes1 = new ArrayList<>();
        ArrayList<Integer> listNodes2 = new ArrayList<>();
        int n1 = 0;
        int n2 = 0;
        while (head1 != null) {
            n1++;
            listNodes1.add(head1.val);
            head1 = head1.next;
        }
        while (head2 != null) {
            n2++;
            listNodes2.add(head2.val);
            head2 = head2.next;
        }
        int n = n1 > n2 ? n1 : n2;
        if (n1 < n) {
            for (int i = 0; i < n - n1; i++) {
                listNodes1.add(0);
            }
            for (int i = n - 1; i >= 0; i--) {
                if (i >= n - n1) {
                    listNodes1.set(i, listNodes1.get(i - (n - n1)));
                } else {
                    listNodes1.set(i, 0);
                }
            }
        } else if (n2 < n) {
            for (int i = 0; i < n - n2; i++) {
                listNodes2.add(0);
            }
            for (int i = n - 1; i >= 0; i--) {
                if (i >= n - n2) {
                    listNodes2.set(i, listNodes2.get(i - (n - n2)));
                } else {
                    listNodes2.set(i, 0);
                }
            }
        }
        ArrayList<ListNode> listNodes = new ArrayList<>();
        int jinwei = 0;
        for (int i = n - 1; i >= 0; i--) {
            int a = listNodes1.get(i) + listNodes2.get(i) + jinwei;
            if (a >= 10) {
                jinwei = 1;
                a = a - 10;
            } else {
                jinwei = 0;
            }
            listNodes.add(new ListNode(a));
        }
        if (jinwei == 1) {
            listNodes.add(new ListNode(1));
        }
        ListNode listNode = new ListNode(-1);
        for (int i = 0; i < listNodes.size(); i++) {
            ListNode pre = listNode;
            listNode = new ListNode(listNodes.get(i).val);
            listNode.next = i == 0 ? null : pre;
        }
        return listNode;
    }

发表于 2023-10-18 01:06:18 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        ListInfo li1 = reverseList(head1);
        ListInfo li2 = reverseList(head2);
        ListNode p1 = li1.node;
        ListNode p2 = li2.node;
        int offset = 0;
        ListNode curr = null;
        ListNode dummyLong = li1.length > li2.length ? p1 : p2;
        ListNode dummyShort = li1.length > li2.length ? p2 : p1;
        ListNode dummyHead = dummyLong;
        //以长的链表为主体
        while (dummyLong != null) {
            int sum = (dummyShort == null ? 0 : dummyShort.val )
                      + dummyLong.val
                      + offset;
            //将计算结果覆盖原数值
            if (sum < 10) {
                dummyLong.val = sum;
                offset  = 0;
            } else {
                dummyLong.val = sum % 10;
                offset = sum / 10;
            }
            curr = dummyLong;
            if (dummyShort != null) {
                dummyShort = dummyShort.next;
            }
            dummyLong = dummyLong.next;
        }
        if (offset > 0) {
            //需要进位,创建新节点加到尾部
            ListNode top = new ListNode(offset);
            curr.next = top;
        }
        //链表再次反转,返回头节点
        head1 = reverseList(dummyHead).node;
        return  head1;
    }

    /**
     * 反转链表,返回链表信息(头节点、链表的长度)
     *
     *
     * @param head ListNode类
     * @return ListInfo类
     */
    public ListInfo reverseList(ListNode head) {
        ListNode pre = null;
        ListNode curr = head;
        int length = 0;
        while (curr != null) {
            ListNode nextTemp = curr.next;
            curr.next = pre;
            pre = curr;
            curr = nextTemp;
            length++;
        }
        return new ListInfo(pre, length);
    }

    class ListInfo {
        private ListNode node;
        private int length;

        ListInfo(ListNode node, int length) {
            this.node = node;
            this.length = length;
        }
    }

}

发表于 2023-10-10 18:52:24 回复(0)
import java.util.*;

/*
对链表反转后进行相加
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/

public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
// write code here
ListNode h1=reverse(head1);
ListNode h2=reverse(head2);
ListNode res=new ListNode(0);
ListNode re=res;
while(h1!=null&&h2!=null){
int sum=h1.val+h2.val+res.val;
if(sum<10){
res.val=sum;
res.next=new ListNode(0);
}else{
res.val=sum%10;
res.next=new ListNode(1);
}
h1=h1.next;
h2=h2.next;
res=res.next;
}
if(h1==null){
while(h2!=null){
int sum=h2.val+res.val;
if(sum<10){
res.val=sum;
res.next=new ListNode(0);
}else{
res.val=sum%10;
res.next=new ListNode(1);
}
h2=h2.next;
res=res.next;
}
}
if(h2==null){
while(h1!=null){
int sum=h1.val+res.val;
if(sum<10){
res.val=sum;
res.next=new ListNode(0);
}else{
res.val=sum%10;
res.next=new ListNode(1);
}
h1=h1.next;
res=res.next;
}
}
ListNode l=reverse(re);
//反转后链表头部为初始化的val=0的,需要输出next的节点
return l.next;
}
public ListNode reverse(ListNode head){
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
ListNode temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
}
发表于 2023-09-21 18:57:37 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        ListNode p1 = head1;
        ListNode p2 = head2;
        ListNode c1 = head1;
        ListNode c2 = head2;
        Stack<Integer>s1 = new Stack<>();
        Stack<Integer>s2 = new Stack<>();
        Stack<Integer>res = new Stack<>();
        while (c1 != null) {
            s1.push(c1.val);
            c1 = c1.next;
        }
        while (c2 != null) {
            s2.push(c2.val);
            c2 = c2.next;
        }
        int carry = 0;
        while (!s1.isEmpty() || !s2.isEmpty()) {
            int sum = 0;
            if (!s1.isEmpty()) {
                sum += s1.pop();
            }
            if (!s2.isEmpty()) {
                sum += s2.pop();
            }
            sum += carry;
            carry = sum / 10;
            res.push(sum % 10);
        }
        ListNode node = new ListNode(-1);
        ListNode tail = node;
        while (!res.isEmpty()) {
            ListNode tmp = new ListNode(res.pop());
            tail.next = tmp;
            tmp.next = null;
            tail = tmp;
        }
        return node.next;
    }
}

发表于 2023-09-14 13:10:58 回复(0)
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {  
        List<Integer> a = getNums(head1,head2);
        ListNode pre = null;
        ListNode p = null;
        for(int i = 0;i < a.size();i++){
          p = new ListNode(a.get(i));
          p.next = pre;
          pre = p;
        }  
        return p;
        
    }
    //将链表相加的结果放到List集合当中
    public ArrayList<Integer> getNums(ListNode node1,ListNode node2){
      ListNode node_1 = reverse(node1);
      ListNode node_2 = reverse(node2);
      ArrayList<Integer> a = new ArrayList<>();
      int add = 0;
      int b = 0;
      int c = 0;
      int sum = 0;
      while(node_1 != null || node_2 != null){
        if(node_1 == null){
          b = 0;
        }else{
          b = node_1.val;
          node_1 = node_1.next;
        }
        if(node_2 == null){
          c = 0;
        }else{
          c = node_2.val;
          node_2 = node_2.next;
        }
        sum = b+c+add;
        add = sum / 10;
        a.add(sum % 10);
      }
      if(add != 0){
        a.add(add);
      }
      return a;
    }
    //反转链表
    public ListNode reverse(ListNode node){
      ListNode sentry = new ListNode(0); 
      sentry.next = node;
      ListNode start = node;
      while(start.next != null){
        ListNode temp = start.next;
        start.next = temp.next;
        temp.next = sentry.next;
        sentry.next = temp;
      }
      return sentry.next;
    }
}

发表于 2023-09-08 16:21:26 回复(1)