链表相加_2_445

LeetCode原题:两数相加:https://leetcode-cn.com/problems/add-two-numbers/

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设这两个数都不会以 0 开头。【表头为低位】

/*
解题思路:
    1.初始化一个虚拟头结点dummy,以及工作指针prev.
    2.循环迭代相加两个链表对应的数字
        2.1 循环的终止条件是:当head1为空并且head2也为空且仅为carry为空时,退出循环
        2.2 循环的内容是:依次取两个链表当前节点的值,然后进行相加。
        2.3 注意,处理当前节点为null时
        2.4 相加后,将值整除10,赋值给新的链表节点,
        2.4 每次都头插法进行连接即可。
    3.返回 dummy.next即可。
*/
    
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode prev = dummy;
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0){
            int x = l1 == null ? 0: l1.val;
            int y = l2 == null ? 0: l2.val;
            int sum = x + y +  carry;
            ListNode node = new ListNode(sum % 10);
            prev.next = node;
            prev = node;
            // prev.next = new ListNode( sum % 10);
            // prev = prev.next;
            carry = sum / 10;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        return dummy.next;
    }
}

LeetCode原题:两数相加II:https://leetcode-cn.com/problems/add-two-numbers-ii/

给你两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。【表头为高位】

/*
解题思路:
    1.利用栈,将两个链表的数值分别存放到栈中。
    2.然后遍历,每次从栈中取出节点,进行相加
    3.相加过程和上面一样。
    4.因为表头是最高位,所以每次连接的时候,需要用头插法。
*/

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode h1 = l1;
        ListNode h2 = l2;
        Stack<ListNode> s1 = new Stack<>();
        Stack<ListNode> s2 = new Stack<>();
        while(h1 != null) {
            s1.push(h1);
            h1 = h1.next;
        }
        while(h2 != null) {
            s2.push(h2);
            h2 = h2.next;
        }
        int carry = 0;
        ListNode prev= null;
        while(!s1.isEmpty() || !s2.isEmpty() || carry != 0){
            int x = s1.isEmpty() ? 0: s1.pop().val;
            int y = s2.isEmpty() ? 0: s2.pop().val;
            int sum = x + y + carry;
            ListNode node = new ListNode(sum % 10);
            node.next = prev;
            prev = node;
            carry = sum / 10;
        }
        return prev;
    }
}

 

posted @ 2022-04-12 15:02  2022年总冠军gogogo  阅读(46)  评论(0)    收藏  举报