leetcode 兩數相加(中等難度)
阿新 • • 發佈:2019-02-19
題目如下:
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
直接能夠想到的就是把連結串列中的陣列組成一個整數然後相加,但是對於較長的連結串列而言,整數範圍是不夠滴(leetcode上最後的例子數字已經超過了64位所能代表的最大整數,浮點數沒有具體計算過),而且時間複雜度,應該是O(2(m+n)),取數一次操作,賦值又一次操作.所以這裡考慮將每一個節點的值相加,然後賦值給新的連結串列,時間複雜度為O(max(m,n)),並且不會出現數值過大無法計算的情況.
程式碼如下
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { p1 := l1 p2 := l2 p1Next := p1 p2Next := p2 p3 := &ListNode{} p3Next := p3 CF := 0 for { if p1Next != nil || p2Next != nil || CF != 0{ v1 :=0 if(p1Next != nil){ v1= p1Next.Val } v2 := 0 if(p2Next != nil){ v2= p2Next.Val } val := v1 + v2 + CF if val >= 10 { p3Next.Val = val - 10 CF = 1 } else { p3Next.Val = val CF = 0 } if p1Next != nil { p1Next = p1Next.Next } if p2Next != nil { p2Next = p2Next.Next } if(p1Next != nil || p2Next!= nil || CF!=0){ p3Next.Next = &ListNode{} p3Next = p3Next.Next } }else{ break } } return p3 }