C 程序添加由链表表示的两个数字 - 集 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
下面是这种方法的实现。
C
// C program to implement the
// above approach
#include
#include
// Linked list node
struct Node
{
int data;
struct Node* next;
};
/* Function to create a new node
with given data */
struct Node* newNode(int data)
{
struct Node* new_node =
(struct Node*)malloc(sizeof(struct Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
/* Function to insert a node at the
beginning of the Singly Linked List */
void push(struct Node** head_ref,
int new_data)
{
// Allocate node
struct Node* new_node = newNode(new_data);
// Link the old list off the new node
new_node->next = (*head_ref);
// Move the head to point to the
// new node
(*head_ref) = new_node;
}
/* Adds contents of two linked
lists and return the head node
of resultant list */
struct Node* addTwoLists(struct Node* first,
struct Node* second)
{
// res is head node of the resultant
// list
struct Node* res = NULL;
struct Node *temp, *prev = 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 ? first->data : 0) +
(second ? 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 = newNode(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)
first = first->next;
if (second)
second = second->next;
}
if (carry > 0)
temp->next = newNode(carry);
// return head of the resultant list
return res;
}
// A utility function to print a
// linked list
void printList(struct Node* node)
{
while (node != NULL)
{
printf("%d ", node->data);
node = node->next;
}
printf("");
}
// Driver code
int main(void)
{
struct Node* res = NULL;
struct Node* first = NULL;
struct Node* second = NULL;
// Create first list 7->5->9->4->6
push(&first, 6);
push(&first, 4);
push(&first, 9);
push(&first, 5);
push(&first, 7);
printf("First List is ");
printList(first);
// Create second list 8->4
push(&second, 4);
push(&second, 8);
printf("Second List is ");
printList(second);
// Add the two lists and see result
res = addTwoLists(first, second);
printf("Resultant list is ");
printList(res);
return 0;
}
输出:
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 了解更多详情!