LeetCode·Pregunta Diaria·445.Suma de Dos Números II·Simulación

Autor: Xiao Xun
Enlace: https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328613/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge- 67qx/
Fuente: Los derechos de autor de LeetCode
pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización, para reimpresión no comercial, indique la fuente.

tema

 

ejemplo

 

tren de pensamiento

Título -> Dadas dos listas enlazadas, el dígito más alto del número está al principio de la lista enlazada. Cada uno de sus nodos almacena solo un solo dígito. Agregar estos números devuelve una nueva lista enlazada.

El método más simple y directo es invertir las dos listas enlazadas, enumerar y acumular desde el encabezado de la lista enlazada después de la inversión, usar la nueva lista enlazada para guardar su valor y finalmente devolver el nodo principal de la nueva lista enlazada. Tenga en cuenta que la nueva lista vinculada debe usar el método de inserción de cola.

La lista vinculada también se puede convertir en una matriz para el procesamiento, enumerar cada elemento de la lista vinculada y almacenarla en la matriz de manera equivalente, por lo que el significado de la pregunta -> la suma de dos números, pero el bit alto está al frente. , por lo que en el proceso de suma de enumeración In, debe enumerarse desde el final hasta el principio y, finalmente, devolver la nueva lista vinculada

Los comentarios del código son muy detallados.

el código


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int arr1[100] = {0}, arr2[100] = {0};
    int index1 = 0, index2 = 0;
    while (l1) {//l1转换为数组
        arr1[index1++] = l1->val;
        l1 = l1->next;
    }
    while (l2) {//l2转换为数组
        arr2[index2++] = l2->val;
        l2 = l2->next;
    }
    int arr3[101] = {0};//记录累和
    int index3 = 0;
    int c = 0;
    for (index3; index3 < 101; index3++) {//枚举数组求和
        if (index1 > 0 && index2 > 0) { //l1,l2都有元素
            arr3[index3] = (arr1[--index1] + arr2[--index2] + c) % 10;
            c = (arr1[index1] + arr2[index2] + c) / 10;
        } else if (index1 > 0) {// l1有元素
            arr3[index3] = (arr1[--index1] + c) % 10;
            c = (arr1[index1] + c) / 10;
        } else if (index2 > 0) {// l2有元素
            arr3[index3] = (arr2[--index2] + c) % 10;
            c = (arr2[index2] + c) / 10;
        } else if (c){// 进位还有元素
            arr3[index3] = c;
            c = 0;
        } else {//都没元素了
            break;
        }
    }
    struct ListNode *haed = (struct ListNode *)malloc(sizeof(struct ListNode));
    haed->next = NULL;
    struct ListNode *next = haed;
    while (index3 > 0) {//数组转换为链表,这里可以和上面合并在一起
        struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
        node->next = NULL;
        node->val = arr3[--index3];
        next->next = node;
        next = node;
    }
    return haed->next;
}

作者:小迅
链接:https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328613/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-67qx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Supongo que te gusta

Origin blog.csdn.net/m0_64560763/article/details/131512532
Recomendado
Clasificación