您的位置:首页 > 其它

LeetCode-Add Two Numbers

2017-08-17 16:22 337 查看
Q :

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8


S1: Time:O(max(m,n)) Space:O(max(m,n))

/**
* Definition for singly-linked list.
* public class ListNode {
*     public var val: Int
*     public var next: ListNode?
*     public init(_ val: Int) {
*         self.val = val
*         self.next = nil
*     }
* }
*/
class Solution {

func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var currentListNode1:ListNode? = l1
var currentListNode2:ListNode? = l2
let resultList = ListNode(0)
var tempLast = resultList
var carry = false
var carryNum = 0

while currentListNode1 != nil {
var sum = 0;
if currentListNode2 != nil {
sum = (currentListNode1?.val)! + (currentListNode2?.val)!
if let next = currentListNode2?.next {
currentListNode2 = next
} else {
currentListNode2 = nil
}
} else {
sum = (currentListNode1?.val)!

}

if carry {
sum = sum + carryNum
carry = false
carryNum = 0
}

if sum >= 10 {
let tempCarryNum = Int(sum / 10)

if tempCarryNum != 0 {
carry = true
carryNum = tempCarryNum
}
}

let nodeVal = Int(sum % 10)
tempLast.next = ListNode(nodeVal)
tempLast = tempLast.next!
if let next = currentListNode1?.next {
currentListNode1 = next
} else {
currentListNode1 = nil
}
}

while currentListNode2 != nil {
var sum = currentListNode2?.val
if carry {
sum = sum! + carryNum
carry = false
carryNum = 0
}

if sum! >= 10 {
let tempCarryNum = Int(sum! / 10)

if tempCarryNum != 0 {
carry = true
carryNum = tempCarryNum
}
}

let nodeVal = Int(sum! % 10)
tempLast.next = ListNode(nodeVal)
tempLast = tempLast.next!
if let next = currentListNode2?.next {
currentListNode2 = next;
} else {
currentListNode2 = nil
}
}

if carry {
tempLast.next = ListNode(carryNum)
}

return resultList.next

}
}




S2: Time:O(max(m,n)) Space:O(max(m,n))

简洁一些,判断少,速度快

/**
* Definition for singly-linked list.
* public class ListNode {
*     public var val: Int
*     public var next: ListNode?
*     public init(_ val: Int) {
*         self.val = val
*         self.next = nil
*     }
* }
*/
class Solution {

func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var currentListNode1:ListNode? = l1
var currentListNode2:ListNode? = l2
let resultList = ListNode(0)
var tempLast = resultList
var carry = 0

while currentListNode1 != nil || currentListNode2 != nil {
var val1 = 0;
if let val = currentListNode1?.val {
val1 = val
}

var val2 = 0;
if let val = currentListNode2?.val {
val2 = val
}

let sum = val1 + val2 + carry
tempLast.next = ListNode(sum%10)
tempLast = tempLast.next!
carry = sum/10

if let next = currentListNode1?.next {
currentListNode1 = next
} else {
currentListNode1 = nil
}

if let next = currentListNode2?.next {
currentListNode2 = next
} else {
currentListNode2 = nil
}
}
if carry > 0 {
tempLast.next = ListNode(carry)
}

return resultList.next

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: