leetcode刷題2:兩數相加add_two_numbers

題目:兩數相加 (難度:中等) 給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。 將兩數相加返回一個新的鏈表。數據結構

你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。app

示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 緣由:342 + 465 = 807學習

思路: 本題的思路很簡單,按照小學數學中學習的加法原理從末尾到首位,對每一位對齊相加便可。 技巧在於如何處理不一樣長度的數字,以及進位和最高位的判斷。將兩個單鏈表表示的數字相加,再將結果用單鏈表表示出來。 主要考察對鏈表的操做,對鏈表這種數據結構的遍歷、增、刪等操做應該熟練。測試

答案:

class ListNode(object):
	def __init__(self, x):
		self.val = x
		self.next = None

class Solution(object):
	def addTwoNumbers(self, l1, l2):
		"""
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
		if not l1:
			return l2
		if not l2:
			return l1

		val1, val2 = [l1.val], [l2.val]

		while l1.next:
			val1.append(l1.next.val)
			l1 = l1.next
			
		while l2.next:
			val2.append(l2.next.val)
			l2 = l2.next

        # 如:str(0) = '2'
		num1 = ''.join([str(i) for i in val1[::-1]])  #列表val1的[2,4,3]反向並str格式化爲字符串形式:'342'
		# print(num1 == '342')
		num2 = ''.join([str(i) for i in val2[::-1]])  #列表val2的[5,6,4]反向並格式化爲字符串形式:'465'
        
		tmp = str(int(num1) + int(num2))[::-1]   # 807格式化爲字符串並反向,獲得字符串tmp = '708'
		res = ListNode(int(tmp[0]))  # 如:res此時包括之後都是鏈表表頭-head,指向第一個節點。res = ListNode(7)
		run_res = res   # run_res剛開始是指向第一個節點  # run_res.val = 7
		for i in range(1, len(tmp)):
			run_res.next = ListNode(int(tmp[i]))
			run_res = run_res.next
		# print(res.val, res.next.val, res.next.next.val)	輸出7 0 8
		return res


# 測試
if __name__ == '__main__':
    # 建立對象Solution
    sol = Solution()
    # 定義l1鏈表
    l1 = ListNode('2')
    l1.next = ListNode(4)
    l1.next.next = ListNode(3)
    # 定義l2鏈表
    l2 = ListNode(5)
    l2.next =  ListNode(6)
    l2.next.next =ListNode(4)
    # 獲取返回值的鏈表
    res = sol.addTwoNumbers(l1, l2)
    print(res.val, res.next.val, res.next.next.val)

輸出:spa

7 0 8
[Finished in 0.2s]

其餘思路

  • 鏈表對應結點相加時增長前一個結點的進位,並保存下一個結點的進位;
  • 兩個鏈表長度不一致時,要處理較長鏈表剩餘的高位和進位計算的值;
  • 若是最高位計算時還產生進位,則還須要添加一個額外結點。
相關文章
相關標籤/搜索