📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 58(1)

📅  最后修改于: 2023-12-03 15:23:03.646000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2014 |问题 58

这是一道关于数据结构的编程题,需要对链表进行操作。

题目描述

给定两个链表,每个链表表示一个整数,链表的每个节点代表该整数的一位数。现在要将这两个整数相加,并将其结果以链表形式返回。

例如:

  • 链表表示的整数1:3->4->2, 表示数字 243
  • 链表表示的整数2:4->6->5, 表示数字 564
  • 相加结果链表:7->0->8, 表示数字 807

链表的节点定义为:

struct ListNode {
  int val;
  ListNode *next;
  ListNode(int x) : val(x), next(NULL) {}
};

实现函数:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
输入

两个链表,其中每个节点的值都是0-9的整数。

输出

一个新的链表,其表示两个整数相加的结果。

示例

输入:

(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:

7 -> 0 -> 8
解题思路
  1. 定义一个指向新链表头节点的指针和一个指向链表当前节点的指针。
  2. 设置一个进位标志,初始值为0。
  3. 对于两个链表,循环遍历它们的每个节点,将当前节点的值相加并加上进位标志。
  4. 如果相加的结果大于10,则将进位标志设置为1。
  5. 将相加的结果加到新链表的末尾,并将指针向后移动。
  6. 遍历完链表后,判断如果进位标志为1,则需要再新链表中加一个节点,值为1,表示进位。
  7. 返回新链表的头节点。
代码实现
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry = 0;
        ListNode* dummyHead = new ListNode(0);
        ListNode* p = dummyHead;
        while (l1 || l2) {
            int val1 = l1 ? l1->val : 0;
            int val2 = l2 ? l2->val : 0;
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            p->next = new ListNode(sum % 10);
            p = p->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) p->next = new ListNode(1);
        return dummyHead->next;
    }
};

以上代码实现了两个链表的相加操作,时间复杂度为 O(max(m,n)),其中 m、n 分别为两个链表的长度。