1. 程式人生 > 其它 >LeetCode-2 兩數相加題解

LeetCode-2 兩數相加題解

題目來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers

題目描述

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

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

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

示例:

輸入: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
題目資料保證列表表示的數字不含前導零

解題思路

此題主要考查的是連結串列的基礎操作,思路十分的明確,連結串列的基礎操作就不加贅述了。

根據題目所述,數字是以連結串列的形式逆序存放的,這樣一來,逆序的問題也不需要考慮了,餘下的問題僅剩兩個:

1、高位補0的問題

由於數字的位數不一定相等,所以連結串列的長度也不一定相等,需要在計算完連結串列共同相加的部分後,會有一條連結串列多出一部分,需要將多出的這部分連線到新的連結串列上去。

2、進位問題

這裡設定了一個標誌位作為進位,每次求和時候會加入標誌位,並且求和完畢後更新標誌位。

重做這道題的原因是當時在學習Python,所以使用了Python寫了一遍這題,熟悉了一下Python的語法。

原始碼展示

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        root 
= ListNode(l1.val + l2.val) root.next = None fa = root if root.val >= 10: root.val = root.val % 10 jw = 1 else: jw = 0 i = 1 p1 = l1.next p2 = l2.next while p1 != None and p2 != None: if p1.val + p2.val + jw >= 10: node = ListNode((p1.val + p2.val + jw) % 10) jw = 1 else: node = ListNode(p1.val + p2.val + jw) jw = 0 fa.next = node fa = node p1 = p1.next p2 = p2.next i += 1 if p1 == None: fa.next = p2 else: fa.next = p1 p = fa.next while jw == 1: if p != None: p.val += 1 if (p.val >= 10): p.val = p.val % 10 else: jw = 0 else: p = ListNode(1) p.next=None fa.next=p break if p.next != None: fa=p p = p.next else: fa=p p = None return root

執行結果