@cxm-2016
2016-12-23T13:45:37.000000Z
字数 2355
阅读 2878
算法
版本:2
作者:陈小默
声明:禁止商业,禁止转载
题目:假设链表中的每一节点的值都在0~9之间,于是我们可以使用整个链表作为一个整数。
例如:
链表9->3->7和链表6->3相加后得到链表1->0->0->0
解法:我们可以先将两个链表转置,然后从低位到高位依次运算。
一下代码给出了三种实现方式,后一种是前一种的简化
data class Node(var value: Int, var next: Node?) {override fun toString(): String {val builder = StringBuilder().append('[')var node: Node? = this.nextbuilder.append(value)while (node != null) {builder.append(',').append('\t').append(node.value)node = node.next}return builder.append(']').toString()}}fun reverseList(list: Node): Node {var pre: Node? = nullvar next: Node? = nullvar head: Node? = listwhile (head != null) {next = head.nexthead.next = prepre = headhead = next}return pre!!}fun addList_v1(list1: Node, list2: Node): Node {var l1: Node? = reverseList(list1)var l2: Node? = reverseList(list2)var next: Node? = nullvar node: Node?var head: Node? = nullvar carry = falsewhile (l1 != null && l2 != null) {var value = l1.value + l2.valueif (carry) value++carry = value > 9if (carry) value %= 10node = Node(value, null)if (head == null) {head = nodenext = node} else {next!!.next = nodenext = next.next}l1 = l1.nextl2 = l2.next}while (l1 != null) {var value = l1.valueif (carry) value++carry = value > 9if (carry) value %= 10node = Node(value, null)if (head == null) {head = nodenext = node} else {next!!.next = nodenext = next.next}l1 = l1.next}while (l2 != null) {var value = l2.valueif (carry) value++carry = value > 9if (carry) value %= 10node = Node(value, null)if (head == null) {head = nodenext = node} else {next!!.next = nodenext = next.next}l2 = l2.next}if (carry) {node = Node(1, null)next!!.next = node}return reverseList(head!!)}fun addList_v2(list1: Node, list2: Node): Node {var l1: Node? = reverseList(list1)var l2: Node? = reverseList(list2)var next: Node?var head: Node? = nullvar carry = 0while (l1 != null && l2 != null) {val value = l1.value + l2.value + carrycarry = value / 10next = headhead = Node(value % 10, next)l1 = l1.nextl2 = l2.next}while (l1 != null) {val value = l1.value + carrycarry = value / 10next = headhead = Node(value % 10, next)l1 = l1.next}while (l2 != null) {val value = l2.value + carrycarry = value / 10next = headhead = Node(value % 10, next)l2 = l2.next}if (carry == 1) {next = headhead = Node(1, next)}return head!!}fun addList(list1: Node, list2: Node): Node {var l1: Node? = reverseList(list1)var l2: Node? = reverseList(list2)var n: Intvar n1: Intvar n2: Intvar next: Node?var head: Node? = nullvar carry = 0while (l1 != null || l2 != null) {n1 = if (l1 != null) l1.value else 0n2 = if (l2 != null) l2.value else 0n = n1 + n2 + carrycarry = n / 10next = headhead = Node(n % 10, next)l1 = if (l1 != null) l1.next else nulll2 = if (l2 != null) l2.next else null}if (carry == 1) {next = headhead = Node(1, next)}return head!!}
