编程语言
首页 > 编程语言> > LintCode领扣算法问题答案:221. 链表求和 II

LintCode领扣算法问题答案:221. 链表求和 II

作者:互联网

221. 链表求和 II

描述

假定用链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。

样例 1:

输入: 
	6->1->7   2->9->5
输出: 
	9->1->2

样例 2:

输入: 
	1->2->3   4->5->6
输出: 
	5->7->9

原题传送门


文章目录


题解

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param l1: The first list.
     * @param l2: The second list.
     * @return: the sum list of l1 and l2.
     */
    public ListNode addLists2(ListNode l1, ListNode l2) {
        // write your code here
    
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        Deque<ListNode> s1 = new LinkedList<>();
        while (l1 != null) {
            s1.push(l1);
            l1 = l1.next;
        }

        Deque<ListNode> s2 = new LinkedList<>();
        while (l2 != null) {
            s2.push(l2);
            l2 = l2.next;
        }

        ListNode h = new ListNode(0);
        // tail
        ListNode t = h;
        // last one
        ListNode l = t;

        while (!s1.isEmpty()
                || !s2.isEmpty()) {
            int v1 = 0;
            int v2 = 0;
            if (!s1.isEmpty()) {
                v1 = s1.pop().val;
            }
            if (!s2.isEmpty()) {
                v2 = s2.pop().val;
            }
            t.val += v1 + v2;
            if (t.val > 9) {
                t.next = new ListNode(1);
                t.val %= 10;
            } else {
                t.next = new ListNode(0);
            }
            l = t;
            t = t.next;
        }

        if (t.val == 0) {
            l.next = null;
        }

        h = this.reverse(h);

        return h;
    }

    private ListNode reverse(ListNode l) {
        Deque<ListNode> stack = new LinkedList<>();

        ListNode h = l;
        while (h.next != null) {
            stack.push(h);
            h = h.next;
        }

        ListNode t = h;
        while (!stack.isEmpty()) {
            t.next = stack.pop();
            t = t.next;
        }
        t.next = null;

        return h;
    }
}

最后说两句

非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~

作者水平有限,如果文章内容有不准确的地方,请指正。

希望小伙伴们都能每天进步一点点。

声明

本文由二当家的白帽子博客原创,转载请注明来源,谢谢~

标签:ListNode,val,LintCode,next,链表,领扣,l2,l1,null
来源: https://blog.csdn.net/leyi520/article/details/112964652