给定两个用链表表示的正整数,每个结点包含一个数位。编写代码对这两个链表表示的整数求和。要求编写一个函数,接受两个链表作为输入。返回值是一个表示两数和的链表。
在这些链表中,数位是反向存放的,也就是个位排在链表首部。
例如:正整数 698 表示为 8 -> 9 -> 6,875表示为 5 -> 7 -> 8,那么输入链表 8 -> 9 -> 6 和 5 -> 7 -> 8,应该返回链表 3 -> 7 -> 5 -> 1(即表示 1573 的链表)。
提示:如果您不记得链表怎么表达的,下面的图是 "8 -> 9 -> 6" 这个链表的示例:
链表有结点构成,最简单的链表结点里面包含两个字段:一个表示值的字段、另一个链接下一个结点的指针或引用。Head 表示一个指向头结点的指针。最后一个结点(尾结点)的下一个结点是空指针(空结点),表示链表没有下一个结点了。
请先定义链表的数据结构,然后编写代码完成上述“求和”的操作。这实际上模拟的是笔算加法的操作,注意进位。
1 public class ExaminationTest { 2 public static void main(String[] args) { 3 test(); 4 } 5 6 public static void test(){ 7 NumberNode x11 = new NumberNode(3, null); 8 NumberNode x12 = new NumberNode(6, x11); 9 NumberNode headX = new NumberNode(4, x12); 10 11 NumberNode y11 = new NumberNode(7, null); 12 NumberNode y12 = new NumberNode(8, y11); 13 NumberNode headY = new NumberNode(9, y12); 14 // NumberNode calculationLinkedX = calculationLinked(headX, headY); 15 // print(calculationLinkedX); 16 17 // 以下为:结果反转为整数形式 18 // int reversal = reversal(calculationLinkedX); 19 // System.out.println("结果:" + reversal); 20 21 22 // 另外一组测试数据 23 NumberNode a25 = new NumberNode(6, null); 24 NumberNode a24 = new NumberNode(6, a25); 25 NumberNode d23 = new NumberNode(6, a24); 26 NumberNode c22 = new NumberNode(9, d23); 27 NumberNode headA = new NumberNode(8, c22); 28 29 NumberNode a32 = new NumberNode(8, null); 30 NumberNode a22 = new NumberNode(7, a32); 31 NumberNode a11 = new NumberNode(5, a22); 32 NumberNode headB = new NumberNode(1, a11); 33 // 另外一组测试数据 34 NumberNode calculationLinkeA = calculationLinked(headA, headB); 35 print(calculationLinkeA); 36 37 // 以下为:结果反转为整数形式 38 int reversal = reversal(calculationLinkeA); 39 System.out.println("正整数:" + reversal); 40 41 } 42 43 private static NumberNode calculationLinked(NumberNode a, NumberNode b){ 44 NumberNode result = new NumberNode(0, null); 45 if(a == null && b == null){ 46 return result; 47 } 48 if(b == null){ 49 return a; 50 } 51 if(a == null){ 52 return b; 53 } 54 return plus(a, b, result); 55 } 56 57 private static NumberNode plus(NumberNode a, NumberNode b, NumberNode result){ 58 NumberNode tail = result; 59 while (tail.next != null){ 60 tail = tail.next; 61 } 62 63 NumberNode next = new NumberNode(0, null);; 64 int headValue = a.value + b.value; 65 int nextV = 0; 66 int currentV = headValue; 67 if(headValue >= 10){ 68 currentV = headValue - 10; 69 nextV = 1; 70 next = new NumberNode(nextV, null); 71 } 72 tail.value += currentV; 73 tail.next = next; 74 75 if(a.next == null && b.next == null){ 76 return result; 77 } 78 if(a.next != null && b.next != null){ 79 result = plus(a.next, b.next, result); 80 } 81 if(a.next == null){ 82 tail.next = b.next; 83 } 84 if(b.next == null){ 85 tail.next = a.next; 86 } 87 return result; 88 } 89 90 private static int reversal(NumberNode numberNode){ 91 if(numberNode == null){ 92 return 0; 93 } 94 NumberNode next = numberNode; 95 String result = numberNode.value+""; 96 while (next.next != null){ 97 next = next.next; 98 result = next.value+""+result; 99 } 100 return Integer.valueOf(result); 101 } 102 103 // 正向打印链表 104 private static void print(NumberNode a){ 105 System.out.print("链表:"); 106 if(a == null){ 107 System.out.print(0); 108 return; 109 } 110 System.out.print(a.value + " -> "); 111 NumberNode next = a; 112 while (next.next != null){ 113 System.out.print(next.next.value); 114 next = next.next; 115 System.out.print(" -> "); 116 } 117 System.out.print("null"); 118 System.out.println(); 119 } 120 121 static class NumberNode{ 122 NumberNode next; 123 int value; 124 public NumberNode() {} 125 public NumberNode(int value, NumberNode next) { 126 this.next = next; 127 this.value = value; 128 } 129 public boolean isTail(){ 130 if(this.next == null){ 131 return true; 132 } 133 return false; 134 } 135 } 136 }
运行效果:
1 链表:9 -> 4 -> 4 -> 5 -> 6 -> null 2 正整数:65449