iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0

Add Two Numbers

leetcode #2

  • 兩個非空單向鏈表,每個節點存一個數字,代表一個整數的反向儲存形式(低位在前)。
  • 計算兩數之和,並以相同形式回傳。
    Ex.:
    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8
    解釋: 342 + 465 = 807

thoughts

  • 使用兩個指針同時遍歷鏈表,模擬「逐位相加 + 進位」。
  • 若某個鏈表較短,則視為 0。
  • 最後若有進位,需補一個新節點。
  • 時間:O(max(m, n))
  • 空間:O(1)(除了輸出鏈表)

Kotlin

fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
    val dummy = ListNode(0)
    var p = l1
    var q = l2
    var curr = dummy
    var carry = 0

    while (p != null || q != null) {
        val x = p?.`val` ?: 0
        val y = q?.`val` ?: 0
        val sum = carry + x + y
        carry = sum / 10
        curr.next = ListNode(sum % 10)
        curr = curr.next!!
        p = p?.next
        q = q?.next
    }
    if (carry > 0) curr.next = ListNode(carry)
    return dummy.next
}

Followup

  • 如果數字是 正向儲存(最高位在前,LeetCode 445),該怎麼改?
  • 如果鏈表非常大(如數百萬位數),是否能用分治法?
  • 如果要處理多個數字鏈表相加,該如何擴展?

上一篇
#22
下一篇
#24
系列文
來都來了-涮就涮吧25
  1. 21
    #20
  2. 22
    #21
  3. 23
    #22
  4. 24
    #23
  5. 25
    #24
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言