2021牛客暑期多校訓練營2
阿新 • • 發佈:2021-08-14
題目描述
給你兩個非空 的連結串列,表示兩個非負的整數。它們每位數字都是按照逆序的方式儲存的,並且每個節點只能儲存一位數字。
請你將兩個數相加,並以相同形式返回一個表示和的連結串列。
你可以假設除了數字 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; }