[链表]链表相加

161 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。

思路

  1. 两个链表反转
  2. 反转的两个链表从头开始相加,将结果添加到新的链表
  3. 判断其中哪个链表还没遍历完,添加到新的链表
  4. 反转新的链表

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        if (head1 == NULL) return head2;
        if (head2 == NULL) return head1;
        ListNode* dummyHead = new ListNode(0);
        ListNode* res = dummyHead;
        int next = 0;
        // 反转链表
        ListNode* newHead1 = rev(head1);
        ListNode* newHead2 = rev(head2);
        // 相加
        while (newHead1 && newHead2)
        {
            int sum = newHead1->val + newHead2->val + next;
            next = sum / 10;
            int num = sum % 10;
            ListNode* node = new ListNode(num);
            res->next = node;
            res = res->next;
            newHead1 = newHead1->next;
            newHead2 = newHead2->next;
        }
        // 两个链表中的长链表和进位相加
        while (newHead1)
        {
            int sum = newHead1->val + next;
            next = sum / 10;
            int num = sum % 10;
            ListNode* node = new ListNode(num);
            res->next = node;
            res = res->next;
            newHead1 = newHead1->next;
        }
        while (newHead2)
        {
            int sum = newHead2->val + next;
            next = sum / 10;
            int num = sum % 10;
            ListNode* node = new ListNode(num);
            res->next = node;
            res = res->next;
            newHead2 = newHead2->next;
        }
        // 添加进位
        if (next)
        {
            ListNode* node = new ListNode(next);
            res->next = node;
        }
        // 将结果反转
        return rev(dummyHead->next);
    }
    ListNode* rev(ListNode* head)
    {
        ListNode* pre =  NULL;
        ListNode* cur = head;
        while (cur)
        {
            ListNode* next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
};