关于java:阿俊带你用Kotlin刷算法一

7次阅读

共计 2049 个字符,预计需要花费 6 分钟才能阅读完成。

/**

  • Created by TanJiaJun on 2021/6/5.
    1. 两数相加(Add Two Numbers)
  • 难度:中等
    *
  • @see Add Two Numbers
    */

class AddTwoNumbers {

public static void main(String[] args) {
    // 示例一
    System.out.print("示例一:");
    Node firstNode =
            new Node(2,
                    new Node(4,
                            new Node(3)));
    Node secondNode =
            new Node(5,
                    new Node(6,
                            new Node(4)));
    printNode(addTwoNumbers(firstNode, secondNode));
    System.out.print("\n");
    // 示例二
    System.out.print("示例二:");
    Node thirdNode = new Node(0);
    Node fourthNode = new Node(0);
    printNode(addTwoNumbers(thirdNode, fourthNode));
    System.out.print("\n");
    // 示例三
    System.out.print("示例三:");
    Node fifthNode =
            new Node(9,
                    new Node(9,
                            new Node(9,
                                    new Node(9,
                                            new Node(9,
                                                    new Node(9,
                                                            new Node(9)))))));
    Node sixthNode =
            new Node(9,
                    new Node(9,
                            new Node(9,
                                    new Node(9))));
    printNode(addTwoNumbers(fifthNode, sixthNode));
    System.out.print("\n");
    // 示例四
    System.out.print("示例四:");
    Node seventhNode = new Node(2);
    Node eightNode = new Node(8);
    printNode(addTwoNumbers(seventhNode, eightNode));
}
/**
 * 工夫复杂度:O(Max(m, n)),其中 m 是第一个结点的长度,n 是第二个结点的长度
 * 空间复杂度:O(1)
 *
 * @param firstNode  第一个结点
 * @param secondNode 第二个结点
 * @return 后果
 */
private static Node addTwoNumbers(Node firstNode, Node secondNode) {Node dummyNode = new Node(-1);
    Node node = dummyNode;
    int carry = 0;
    // 遍历两个链表
    while (firstNode != null || secondNode != null) {// 如果两个链表的长度不雷同的话,[PayPal 下载](https://www.gendan5.com/wallet/PayPal.html) 就在短的链表的前面通过增加若干个 0
        int firstValue = firstNode != null ? firstNode.item : 0;
        int secondValue = secondNode != null ? secondNode.item : 0;
        int value = firstValue + secondValue + carry;
        int newItem = value % 10;
        // 相加后的进位值通过 carry 来存储
        carry = value / 10;
        Node newNode = new Node(newItem);
        if (firstNode != null) {firstNode = firstNode.next;}
        if (secondNode != null) {secondNode = secondNode.next;}
        // 如果在遍历完这两个链表后,carry 的值大于 0,那么就应该在链表的前面减少一个新的结点来存储这个值
        if (firstNode == null && secondNode == null && carry > 0) {newNode.next = new Node(carry);
        }
        node.next = newNode;
        node = node.next;
    }
    return dummyNode.next;
}
/**
 * 打印结点
 *
 * @param node 结点
 */
private static void printNode(Node node) {System.out.print("[");
    while (node != null) {System.out.print(node.item);
        node = node.next;
        if (node != null) {System.out.print(",");
        }
    }
    System.out.print("]");
}
private static class Node {
    int item;
    Node next;
    Node(int item) {this.item = item;}
    Node(int item, Node next) {
        this.item = item;
        this.next = next;
    }
}

}

正文完
 0