用链表表示的两个数字相加的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。
步骤是:
- 从头到尾遍历两个链表
- 从各自的链表中添加两个数字。
- 如果其中一个列表已到达末尾,则将 0 作为其数字。
- 继续它直到列表的末尾。
- 如果两位数之和大于 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 了解更多详情!