1. 程式人生 > 其它 >2021牛客暑期多校訓練營2

2021牛客暑期多校訓練營2

2.兩數相加

題目描述

給你兩個非空 的連結串列,表示兩個非負的整數。它們每位數字都是按照逆序的方式儲存的,並且每個節點只能儲存一位數字。

請你將兩個數相加,並以相同形式返回一個表示和的連結串列。

你可以假設除了數字 0 之外,這兩個數都不會以 0開頭。

示例1:

輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.

示例 2:

輸入:l1 = [0], l2 = [0]
輸出:[0]

示例 3:

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]

提示:

  • 每個連結串列中的節點數在範圍 [1, 100] 內
  • 0 <= Node.val <= 9
  • 題目資料保證列表表示的數字不含前導零

題解

思路很簡單,關鍵在於連結串列的操作

ListNode *addTwoNumbers2(ListNode *l1, ListNode *l2)
{
    ListNode *list1 = l1;
    ListNode *list2 = l2;
    ListNode *sumList = new ListNode(0);  // 和的連結串列頭
    ListNode *node = sumList;  // 和連結串列表尾
    int carry = 0;   // 進位

    // 同時遍歷兩個連結串列
    while (list1 && list2)
    {
        int val = (list1->val + list2->val + carry) % 10; // 當前位的值
        carry = (list1->val + list2->val + carry) / 10;   // 當前位的進位
        node->next = new ListNode(val);
        node = node->next;
        list1 = list1->next;
        list2 = list2->next;
    }

    // list2 遍歷完,list1 還沒遍歷完
    while (list1)
    {
        int val = (list1->val + carry) % 10;
        carry = (list1->val + carry) / 10;
        node->next = new ListNode(val);
        node = node->next;
        list1 = list1->next;
    }

    // list1 遍歷完, list2 還沒遍歷完
    while (list2)
    {
        int val = (list1->val + carry) % 10;
        carry = (list1->val + carry) / 10;
        node->next = new ListNode(val);
        node = node->next;
        list2 = list2->next;
    }

    // 最高位是否發生進位
    if (carry != 0)
        node->next = new ListNode(carry);

    return sumList->next;
}