2.5 题目:
两个链表表示两个数,每个节点表示一个数位。要求实现每位相加,输出结果
比如:(7 -->1 -->6) + (5 --> 9 -->2) 即617+295
输出:2 --> 1 --> 9 即912
1、反向存放
2、正向存放(进阶)
解法:
Node Class定义:
- public static class Node<E>{
- private E item;
- private Node<E> next;
- private boolean isValid = true;
- public boolean isValid() {
- return isValid;
- }
- public Node(E item) {
- this.item = item;
- }
- public E getItem() {
- return item;
- }
- public void setItem(E item) {
- this.item = item;
- }
- public Node<E> getNext() {
- return next;
- }
- public void setNext(Node<E> next) {
- this.next = next;
- }
- @Override
- public String toString() {
- return "Node [item=" + item + "]";
- }
- }
Result类,用于存放 每位计算的结果 和是否进位
- public static class Result{
- int digit;
- boolean isCarried;
- }
1、正向存放
- public static Node<Integer> addTwoList(Node<Integer> head1,Node<Integer> head2){
- if(head1 == null && head2 == null)
- return null;
- Node<Integer> p = head1;
- Node<Integer> q = head2;
- Node<Integer> head = null;
- Node<Integer> tail = null;
- boolean isCarried = false;
- while(p != null || q != null){
- Result result = null;
- if(p == null){
- result = doAdd(0,q.item,isCarried);
- }
- else if(q == null){
- result = doAdd(p.item,0,isCarried);
- }
- else{
- result = doAdd(p.item,q.item,isCarried);
- }
- Node<Integer> newNode = new Node<Integer>(result.digit);
- if(head == null){
- newNode.next = head;
- head = newNode;
- tail = newNode;
- }else{
- tail.next = newNode;
- newNode.next = null;
- tail = newNode;
- }
- if(result.isCarried){
- isCarried = true;
- }
- else{
- isCarried = false;
- }
- if(p == null){
- q = q.next;
- }
- else if(q == null){
- p = p.next;
- }
- else{
- p = p.next;
- q = q.next;
- }
- }
- return head;
- }
- private static Result doAdd(Integer item1, Integer item2, boolean isCarried) {
- Result result = new Result();
- if(!isCarried){
- int temp = item1 + item2;
- if(temp>10){
- result.digit = temp % 10;
- result.isCarried = true;
- }
- else{
- result.digit = temp;
- result.isCarried = false;
- }
- }else{
- int temp = item1 + item2 + 1;
- if(temp>10){
- result.digit = temp % 10;
- result.isCarried = true;
- }
- else{
- result.digit = temp;
- result.isCarried = false;
- }
- }
- return result;
- }
测试用例:
- @Test
- public void test_2_5(){
- Node<Integer> head1 = new Node<>(0);
- createIntegerNode(head1, 10);
- Node<Integer> head2 = new Node<>(0);
- createIntegerNode(head2, 20);
- printNodeList(head1);
- printNodeList(head2);
- Node<Integer> result = LinkedListUtil.addTwoList(head1, head2);
- printNodeList(result);
- }
- private Node<Integer> createIntegerNode(Node<Integer> head,int number){
- Node<Integer> p = head;
- for(int i = 1;i < number;i++){
- if(i<(number/2)){
- p.setNext(new Node<Integer>(i));
- }
- else{
- p.setNext(new Node<Integer>(i%(number/2)));
- }
- p = p.getNext();
- }
- return head;
- }
- private <E> void printNodeList(Node<E> head){
- Node<E> node = head;
- while(node != null && node.isValid()){
- System.out.print(node.getItem() + " ");
- node = node.getNext();
- }
- System.out.println();
- }
输出结果:
0 1 2 3 4 0 1 2 3 4
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 5 7 9 1 4 1 1 2 3 4 5 6 7 8 9
2、逆向存放
待续。。。