添加由链接列表表示的数字

时间:2016-04-05 20:11:37

标签: java linked-list

我坚持这个问题:

您有两个由链表表示的数字,其中每个节点包含一个数字。数字以相反的顺序存储,使得1的数字位于列表的开头。编写一个函数,添加两个数字并将总和作为链表返回。 例 输入:(3 - > 1 - > 5),(5 - > 9 - > 2) 输出:8 - > 0 - > 8

问题是我的结果是8 8,而结果应该是8 0 8。 我打印出这笔钱,它是8 10 8所以它应该工作。 有任何想法吗?

这是我的代码:

public Node addNumbers(Node number1, Node number2) {

        if(number1 == null && number2 == null)
            return null;

        Node sumOf = null;
        int sum = 0;
        int carry = 0;

        while(number1 != null && number2 != null) {
            sum = number1.data + number2.data + carry;
            System.out.println(sum);
            // update carry for next operation 
            if(sum > 9) 
                carry = 1;
            else 
                carry = 0;

            if(sum > 9) {
                if(sumOf == null) {
                    sumOf = new Node(sum % 10);
                } else {
                    sumOf.next = new Node(sum % 10);
                }

            } else {
                if(sumOf == null) {
                    sumOf = new Node(sum);
                } else {
                    sumOf.next = new Node(sum);
                }

            }

            number1 = number1.next;
            number2 = number2.next;
        }

        return sumOf;
    }

    public void toString(Node node) {
        System.out.println();
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }

    public static void main(String[] args) {

        AddTwoNumbers add = new AddTwoNumbers();

        number1 = new Node(3);
        number1.next = new Node(1);
        number1.next.next = new Node(5);

        number2  = new Node(5);
        number2.next = new Node(9);
        number2.next.next = new Node(2);

        System.out.println("numbers: ");
        add.toString(number1);
        add.toString(number2);

        System.out.println();
        System.out.println("after adding: ");
        add.toString(add.addNumbers(number1, number2));
    }
}

4 个答案:

答案 0 :(得分:1)

您只设置sumOf(如果是null)和sumOf.next(如果sumOf不是null)。因此,您的结果列表永远不会有两个以上的元素。您需要跟踪列表的当前尾部并附加 ,而不是始终附加到sumOf

此外,您需要处理一个输入数字比另一个输入数字更多的情况,以及在耗尽所有输入数字后您具有非零进位的情况。你目前也没办法处理。

答案 1 :(得分:0)

这是解决方案,请注意当两个整数的总和大于9时我继续前进,否则我继续使用列表中下一个整数的总和。

class Node {
    private Object data;
    private Node next;
    public Object getData() { return data; }
    public void setData(Object data) {  this.data = data; }
    public Node getNext() { return next; }
    public void setNext(Node next) { this.next = next; }
    public Node(final Object data, final Node next) {
        this.data = data;
        this.next = next;
    }
    @Override
    public String toString() { return "Node:[Data=" + data + "]"; }
}


class SinglyLinkedList {
    Node start;
    public SinglyLinkedList() { start = null; }

    public void addFront(final Object data) {
        // create a reference to the start node with new data
        Node node = new Node(data, start);

        // assign our start to a new node
        start = node;
    }

    public void addRear(final Object data) {
        Node node = new Node(data, null);
        Node current = start;

        if (current != null) {
            while (current.getNext() != null) {
                current = current.getNext();
            }
            current.setNext(node);
        } else {
            addFront(data);
        }
    }

    public void deleteNode(final Object data) {
        Node previous = start;

        if (previous == null) {
            return;
        }

        Node current = previous.getNext();

        if (previous != null && previous.getData().equals(data)) {
            start = previous.getNext();
            previous = current;
            current = previous.getNext();
            return;
        }

        while (current != null) {
            if (current.getData().equals(data)) {
                previous.setNext(current.getNext());
                current = previous.getNext();
            } else {
                previous = previous.getNext();
                current = previous.getNext();
            }
        }
    }

    public Object getFront() {
        if (start != null) {
            return start.getData();
        } else {
            return null;
        }
    }

    public void print() {
        Node current = start;

        if (current == null) {
            System.out.println("SingleLinkedList is Empty");
        }

        while (current != null) {
            System.out.print(current);
            current = current.getNext();
            if (current != null) {
                System.out.print(", ");
            }
        }
    }

    public int size() {
        int size = 0;

        Node current = start;

        while (current != null) {
            current = current.getNext();
            size++;
        }
        return size;
    }

    public Node getStart() {
        return this.start;
    }

    public Node getRear() {
        Node current = start;
        Node previous = current;
        while (current != null) {
            previous = current;
            current = current.getNext();
        }
        return previous;
    }
}

public class AddNumbersInSinglyLinkedList {
    public static void main(String[] args) {
        SinglyLinkedList listOne = new SinglyLinkedList();
        SinglyLinkedList listTwo = new SinglyLinkedList();
        listOne.addFront(5);
        listOne.addFront(1);
        listOne.addFront(3);
        listOne.print();
        System.out.println();
        listTwo.addFront(2);
        listTwo.addFront(9);
        listTwo.addFront(5);
        listTwo.print();
        SinglyLinkedList listThree = add(listOne, listTwo);
        System.out.println();
        listThree.print();
    }

    private static SinglyLinkedList add(SinglyLinkedList listOne, SinglyLinkedList listTwo) {
        SinglyLinkedList result = new SinglyLinkedList();
        Node startOne = listOne.getStart();
        Node startTwo = listTwo.getStart();
        int carry = 0;
        while (startOne != null || startTwo != null) {
            int one = 0;
            int two = 0;
            if (startOne != null) {
                one = (Integer) startOne.getData();
                startOne = startOne.getNext();
            }
            if (startTwo != null) {
                two = (Integer) startTwo.getData();
                startTwo = startTwo.getNext();
            }
            int sum = carry + one + two;
            carry = 0;
            if (sum > 9) {
                carry = sum / 10;
                result.addRear(sum % 10);
            } else {
                result.addRear(sum);
            }
        }
        return result;
    }
}

示例运行

Node:[Data=3], Node:[Data=1], Node:[Data=5]
Node:[Data=5], Node:[Data=9], Node:[Data=2]
Node:[Data=8], Node:[Data=0], Node:[Data=8]

答案 2 :(得分:0)

**#In Python:-**

class Node():
    def __init__(self,value):
        self.value=value
        self.nextnode=None

class LinkedList():
    def __init__(self):
        self.head=None

    def add_element(self,value):
        node=Node(value)
        if self.head is None:
            self.head =node
            return
        crnt_node=self.head
        while crnt_node.nextnode is not None:           
            crnt_node=crnt_node.nextnode
        crnt_node.nextnode=node

    def reverse_llist(self):
        crnt_node=self.head
        if crnt_node == None:
            print('Empty Linkned List')
            return 
        old_node = None
        while crnt_node:
            temp_node = crnt_node.nextnode
            crnt_node.nextnode = old_node
            old_node = crnt_node
            crnt_node = temp_node
        self.head = old_node

    def converted_llist(self):
        crnt_node=self.head
        carry_value=0
        while True:
            #print(crnt_node.value)
            if (crnt_node.value+1)%10==0:
                carry_value=1
                crnt_node.value=0
                print(crnt_node.value,end='->')
            else:
                print(crnt_node.value+carry_value,end='->')
            if crnt_node.nextnode is  None:
                break
            crnt_node=crnt_node.nextnode
        print('None')

    def print_llist(self):
        crnt_node=self.head
        while True:
            print(crnt_node.value,end='->')
            if crnt_node.nextnode is None:
                break
            crnt_node=crnt_node.nextnode
        print('None')


list_convert=LinkedList()
list_convert.add_element(1)
list_convert.print_llist()
list_convert.add_element(9)
list_convert.print_llist()
list_convert.add_element(9)
list_convert.print_llist()
list_convert.add_element(9)
list_convert.print_llist()

list_convert.reverse_llist()
list_convert.print_llist()
list_convert.converted_llist()

答案 3 :(得分:-1)

/* Adds contents of two linked lists and return the head node of resultant list */
    struct Node* addTwoLists (struct Node* first, struct Node* second)
    {
        struct Node* res = NULL; // res is head node of the resultant list
        struct Node *temp, *prev = NULL;
        int carry = 0, sum;

        while (first != NULL || second != NULL) //while both lists exist
        {
            // Calculate value of next digit in resultant list.
            // The next digit is sum of following things
            // (i)  Carry
            // (ii) Next digit of first list (if there is a next digit)
            // (ii) Next digit of second list (if there is a next digit)
            sum = carry + (first? first->data: 0) + (second? second->data: 0);

            // update carry for next calulation
            carry = (sum >= 10)? 1 : 0;

            // update sum if it is greater than 10
            sum = sum % 10;

            // Create a new node with sum as data
            temp = newNode(sum);

            // if this is the first node then set it as head of the resultant list
            if(res == NULL)
                res = temp;
            else // If this is not the first node then connect it to the rest.
                prev->next = temp;

            // Set prev for next insertion
            prev  = temp;

            // Move first and second pointers to next nodes
            if (first) first = first->next;
            if (second) second = second->next;
        }

        if (carry > 0)
          temp->next = newNode(carry);

        // return head of the resultant list
        return res;
    }

您可以查看该链接以获得更清晰的解释。解决方案在Java和C ++ http://www.geeksforgeeks.org/add-two-numbers-represented-by-linked-lists/

中给出