題目在leetcode上的鏈接爲:
https://leetcode-cn.com/problems/add-two-numbers/
題目描述
解題思路
將鏈表中對應節點數字進行相加的操作,同時注意考慮進位問題即可。具體的做法如下:
初始化進位數carry=0
初始化p1,p2分別爲l1,l2的頭節點
循環判斷當p1或者p2不爲空時:
如果p1不爲空,則將p1節點的值賦給x,如果p1爲空,則進行補零,將0賦給x
如果p2不爲空,則將p2節點的值賦給y,如果p2爲空,則進行補零,將0賦給y
此時的value值爲x+y+carry
如果value大於9,則將value置爲value-10且進位數carry置爲1;否則將carry置爲0
將value作爲值創建一個新的節點插入到新鏈表的尾部
判斷p1,p2是否爲空,如果不爲空則前進一個節點
循環結束後判斷進位數是否大於0,若大於0,則在新鏈表的尾部增加一個值爲carry的節點
解題思路中需要注意的兩點爲:
(1)當p1或者p2爲空時,要進行補零操作
(2)最後可能會存在進位的情況,需要考慮
複雜度分析:
設m,n分別表示鏈表l1,l2的長度
由於需要遍歷完兩個鏈表,所以該算法的時間複雜度爲o(max(m,n))
由於需要創建一個新的鏈表儲存結果,該算法的空間複雜度爲o(max(m,n)),需要創建的鏈表的最大長度爲o(max(m,n))+1
python代碼:
# Definition for singly-linked list.
# 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
"""
p1 = l1
p2 = l2
head = None
current = None
carry = 0 #進位數
while p1 != None or p2 != None:
x = p1.val if p1 != None else 0
y = p2.val if p2 != None else 0
value = x + y + carry
if value > 9:
value = value - 10
carry = 1
else:
carry = 0
if head == None:
head = ListNode(value)
current = head
else:
current.next = ListNode(value)
current = current.next
if p1 != None:
p1 = p1.next
if p2 != None:
p2 = p2.next
if carry > 0:
current.next = ListNode(carry)
return head