美文网首页
链表求和(lintcode 167题以及221题)

链表求和(lintcode 167题以及221题)

作者: 赵仝 | 来源:发表于2017-06-09 12:58 被阅读0次
package suanfa.lintcode;

import java.util.Stack;

//链表
class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class SumListNode {

    /**
     * 链表求和1:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,
     * 使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
     * 
     * @param l1
     *            example:3->1->5->null
     * @param l2
     *            example:5->9->2->null
     * @return    
     *            example:8->0->8->null
     */
    public ListNode addListNode1(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode node = result;
        // 进位标志
        int flag = 0;
        while (l1 != null && l2 != null) {
            int value = l1.val + l2.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while (l1 != null) {
            int value = l1.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l1 = l1.next;
        }
        while (l2 != null) {
            int value = l2.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l2 = l2.next;
        }
        if (flag == 1) {
            node.next = new ListNode(1);
            node = node.next;
        }
        return result.next;
    }

    /**
     * 链表求和2: 假定用一个链表表示两个数,其中每个节点仅包含一个数字。
     * 假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式
     * 
     * @param l1
     *            example:6->1->7
     * @param l2
     *            example:2->9->5
     * @return    
     *            example:9->1->2
     */
    public ListNode addListNode2(ListNode l1, ListNode l2) {
        Stack<Integer> stack1 = getListNodeStack(l1);
        Stack<Integer> stack2 = getListNodeStack(l2);
        ListNode result = new ListNode(0);
        int flag = 0; // 进位标志

        // 对于两个链表,长度相等时计算
        while (!stack1.isEmpty() && !stack2.isEmpty()) {
            int value = stack1.pop() + stack2.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 创建一个新的节点
            ListNode curr = new ListNode(value);
            // 当前节点的next 指向之前的一个节点
            curr.next = result.next;
            // 将当前节点存储起来
            result.next = curr;
        }

        // 当第一个链表长度大于第二个链表长度时
        while (!stack1.isEmpty()) {
            int value = stack1.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 创建一个新的节点
            ListNode curr = new ListNode(value);
            // 当前节点的next 指向之前的一个节点
            curr.next = result.next;
            // 将当前节点存储起来
            result.next = curr;
        }

        // 当第二个链表长度大于第一个链表长度时
        while (!stack2.isEmpty()) {
            int value = stack2.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 创建一个新的节点
            ListNode curr = new ListNode(value);
            // 当前节点的next 指向之前的一个节点
            curr.next = result.next;
            // 将当前节点存储起来
            result.next = curr;
        }

        // 如果flag等于1,则需要创建一个新的节点
        if (flag == 1) {
            ListNode curr = new ListNode(1);
            curr.next = result.next;
            result.next = curr;
        }

        return result.next;
    }

    /**
     * 将链表存储到栈里面
     * 
     * @param node
     * @return Stack
     */
    public Stack<Integer> getListNodeStack(ListNode node) {
        Stack<Integer> stack = new Stack<>();
        while (node != null) {
            stack.push(node.val);
            node = node.next;
        }
        return stack;
    }
}

相关文章

网友评论

      本文标题:链表求和(lintcode 167题以及221题)

      本文链接:https://www.haomeiwen.com/subject/frzxqxtx.html