📌  相关文章
📜  用链表表示的两个数字相加的Java程序 - 集 1

📅  最后修改于: 2022-05-13 01:54:49.444000             🧑  作者: Mango

用链表表示的两个数字相加的Java程序 - 集 1

给定由两个列表表示的两个数字,编写一个返回和列表的函数。和列表是两个输入数字相加的列表表示。

示例

Input: List1: 5->6->3 // represents number 563 List2: 8->4->2 // represents number 842 Output: Resultant list: 1->4->0->5 // represents number 1405 Explanation: 563 + 842 = 1405

Input: List1: 7->5->9->4->6 // represents number 75946List2: 8->4 // represents number 84Output: Resultant list: 7->6->0->3->0// represents number 76030Explanation: 75946+84=76030

方法:遍历两个列表,并一个接一个地选择两个列表的节点并添加值。如果总和大于 10,则进位为 1 并减少总和。如果一个列表的元素多于另一个,则将此列表的其余值视为 0。

步骤是:

  1. 从头到尾遍历两个链表
  2. 从各自的链表中添加两个数字。
  3. 如果其中一个列表已到达末尾,则将 0 作为其数字。
  4. 继续它直到列表的末尾。
  5. 如果两位数之和大于 9,则设置进位为 1,当前位数为sum % 10

下面是这种方法的实现。

Java
// Java program to add two numbers
// represented by linked list
class LinkedList 
{
    static Node head1, head2;
  
    static class Node 
    {
        int data;
        Node next;
  
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    /* Adds contents of two linked
       lists and return the head node
       of resultant list */
    Node addTwoLists(Node first, 
                     Node second)
    {
        // res is head node of the 
        // resultant list
        Node res = null;
        Node prev = null;
        Node temp = null;
        int carry = 0, sum;
  
        // while both lists exist
        while (first != null ||
               second != null) 
        {
            // 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 != null ? first.data : 0) + 
                  (second != null ? second.data : 0);
  
            // Update carry for next calculation
            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 = new Node(sum);
  
            // if this is the first node then set
            // it as head of the resultant list
            if (res == null) 
            {
                res = temp;
            }
  
            // If this is not the first
            // node then connect it to the rest.
            else 
            {
                prev.next = temp;
            }
  
            // Set prev for next insertion
            prev = temp;
  
            // Move first and second pointers
            // to next nodes
            if (first != null) 
            {
                first = first.next;
            }
            if (second != null) 
            {
                second = second.next;
            }
        }
  
        if (carry > 0) 
        {
            temp.next = new Node(carry);
        }
  
        // return head of the resultant 
        // list
        return res;
    }
  
    /* Utility function to print a 
       linked list */
    void printList(Node head)
    {
        while (head != null) 
        {
            System.out.print(head.data + 
                             " ");
            head = head.next;
        }
        System.out.println("");
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        LinkedList list = new LinkedList();
  
        // Creating first list
        list.head1 = new Node(7);
        list.head1.next = new Node(5);
        list.head1.next.next = new Node(9);
        list.head1.next.next.next = 
        new Node(4);
        list.head1.next.next.next.next =  
        new Node(6);
        System.out.print("First List is ");
        list.printList(head1);
  
        // Creating second list
        list.head2 = new Node(8);
        list.head2.next = new Node(4);
        System.out.print("Second List is ");
        list.printList(head2);
  
        // Add the two lists and see the result
        Node rs = list.addTwoLists(head1, head2);
        System.out.print("Resultant List is ");
        list.printList(rs);
    }
}
// This code is contributed by Mayank Jaiswal


输出:

First List is 7 5 9 4 6 
Second List is 8 4 
Resultant list is 5 0 0 5 6 

复杂性分析:

  • 时间复杂度: O(m + n),其中 m 和 n 分别是第一个和第二个列表中的节点数。
    列表只需要遍历一次。
  • 空间复杂度: O(m + n)。
    需要一个临时链表来存储输出编号

请参考完整的文章添加链表表示的两个数字 |设置 1 了解更多详情!