1. 程式人生 > >leetcode 兩數相加(中等難度)

leetcode 兩數相加(中等難度)

題目如下:
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 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
}