• [Swift]LeetCode445. 两数相加 II | Add Two Numbers II


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10339558.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first 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.

    Follow up:
    What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

    Example:

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

    给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 

    你可以假设除了数字 0 之外,这两个数字都不会以零开头。

    进阶:

    如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

    示例:

    输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出: 7 -> 8 -> 0 -> 7

    64ms
     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    14         var n1:Int = getLength(l1)
    15         var n2:Int = getLength(l2)
    16         var head:ListNode? = ListNode(1)
    17         head!.next = (n1 > n2) ? helper(l1, l2, n1 - n2) : helper(l2, l1, n2 - n1)
    18         if head!.next!.val > 9
    19         {
    20             head!.next!.val %= 10
    21             return head
    22         }
    23         return head!.next
    24     }
    25     
    26     func getLength(_ head: ListNode?) -> Int
    27     {
    28         var head = head
    29         var cnt:Int = 0
    30         while(head != nil)
    31         {
    32             cnt += 1
    33             head = head!.next
    34         }
    35         return cnt
    36     }
    37     
    38     func helper(_ l1: ListNode?, _ l2: ListNode?,_ diff:Int) -> ListNode?
    39     {
    40         if l1 == nil {return nil}
    41         var res:ListNode? = (diff == 0) ? ListNode(l1!.val + l2!.val) : ListNode(l1!.val)
    42         var post:ListNode? = (diff == 0) ? helper(l1!.next, l2!.next, 0) : helper(l1!.next, l2, diff - 1)
    43         if post != nil && post!.val > 9
    44         {
    45             post!.val %= 10
    46             res!.val += 1
    47         }
    48         res!.next = post
    49         return res
    50     }
    51 }

    92ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {    
    13 func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode?       {
    14     var array1: [Int] = []
    15     var array2: [Int] = []
    16     var array3: [Int] = []
    17     var list1 = l1, list2 = l2
    18     
    19     while list1 != nil {
    20         array1.append(list1!.val)
    21         list1 = list1?.next
    22     }
    23     
    24     while list2 != nil{
    25         array2.append(list2!.val)
    26         list2 = list2?.next
    27     }
    28     
    29     var flag = 0
    30     while array1.last != nil || array2.last != nil {
    31         var sum = (array1.popLast() ?? 0) + (array2.popLast() ?? 0) + flag
    32         if sum >= 10{
    33             flag = 1
    34             sum = sum - 10
    35         }else{
    36             flag = 0
    37         }
    38         array3.append(sum)
    39     }
    40     if flag == 1{
    41         array3.append(1)
    42     }
    43     let list3: ListNode? = ListNode(-1)
    44     var list4 = list3
    45 
    46     while array3.last != nil{
    47         list4?.next = ListNode(array3.popLast()!)
    48         list4 = list4?.next
    49     }
    50     return list3?.next
    51  }
    52 }

    100ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    14         guard let l1 = l1, l1.val != 0 else {
    15             return l2
    16         }
    17 
    18         guard let l2 = l2, l2.val != 0 else {
    19             return l1
    20         }
    21 
    22         var next: ListNode? = l1
    23         var nums1: [Int] = []
    24         while next != nil {
    25             nums1.append(next!.val)
    26             next = next?.next
    27         }
    28 
    29         var next2: ListNode? = l2
    30         var nums2: [Int] = []
    31         while next2 != nil {
    32             nums2.append(next2!.val)
    33             next2 = next2?.next
    34         }
    35 
    36         let loopCount = max(nums1.count, nums2.count)
    37         next = l1
    38         if nums1.count < nums2.count {
    39             let temp = nums2
    40             nums2 = nums1
    41             nums1 = temp
    42             next = l2
    43         }
    44 
    45         let count = nums1.count
    46 
    47         for index in 0..<loopCount {
    48             var num2 = 0
    49             let index2 = nums2.count - 1 - index
    50             if index2 >= 0 {
    51                 num2 = nums2[index2]
    52             }
    53 
    54             let sum = nums1[nums1.count - 1 - index] + num2
    55             if sum >= 10 {
    56                 nums1[nums1.count - 1 - index] = sum % 10
    57                 if nums1.count - 2 - index < 0 {
    58                     nums1.insert(1, at: 0)
    59                 } else {
    60                     nums1[nums1.count - 2 - index] += 1
    61                 }
    62             } else {
    63                 if index2 < 0 {
    64                     break
    65                 }
    66                 
    67                 nums1[nums1.count - 1 - index] = sum
    68             }
    69         }
    70 
    71         var root: ListNode!
    72         var index = 0
    73         if count < nums1.count {
    74             root = ListNode(nums1[0])
    75             root.next = next
    76             index = 1
    77         } else {
    78             root = next
    79         }
    80 
    81         while index < nums1.count {
    82             next?.val = nums1[index]
    83             next = next?.next
    84             index += 1
    85         }
    86 
    87         return root
    88     }
    89 }

    124ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func reverse(_ list: ListNode?) -> ListNode?{
    14     var l1 = list
    15     var pre: ListNode? = nil
    16     while l1 != nil {
    17         let temp = l1?.next
    18         l1?.next = pre
    19         pre = l1
    20         l1 = temp
    21     }
    22     return pre
    23 }
    24     
    25 func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode?       {
    26     let list1 = self.reverse(l1)
    27     let list2 = self.reverse(l2)
    28     let list3: ListNode? = ListNode(-1)
    29     
    30     var ll1 = list1, ll2 = list2, ll3 = list3
    31     var flag = 0
    32     while ll1 != nil || ll2 != nil{
    33         let ll1value = ll1?.val ?? 0
    34         let ll2value = ll2?.val ?? 0
    35         var sum = ll1value + ll2value + flag
    36         if sum >= 10{
    37             flag = 1
    38             sum = sum - 10
    39         }else{
    40             flag = 0
    41         }
    42         ll3?.next = ListNode(sum)
    43         ll3 = ll3?.next
    44         ll2 = ll2?.next
    45         ll1 = ll1?.next
    46     }
    47     if flag == 1{
    48         ll3?.next = ListNode(1)
    49     }
    50     return self.reverse(list3?.next)
    51   }
    52 }

    156ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    14         var rl1 = reverseList(l1)
    15         var rl2 = reverseList(l2)
    16         
    17         var rres = addTwoNumbers1(rl1, rl2)
    18         
    19         return reverseList(rres)
    20     }
    21     
    22     func reverseList(_ head: ListNode?) -> ListNode? {
    23         var cur = head
    24         var pre: ListNode? = nil
    25         
    26         while cur != nil {
    27             var next = cur!.next
    28             cur!.next = pre
    29             pre = cur
    30             cur = next
    31         }
    32         
    33         return pre
    34     }
    35     
    36     func addTwoNumbers1(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    37         var cur1 = l1
    38         var cur2 = l2
    39         var head: ListNode? = nil
    40         var pre: ListNode? = nil
    41         
    42         var carryBit = 0
    43         
    44         while cur1 != nil || cur2 != nil {
    45             var sum: Int;
    46             if cur1 != nil && cur2 != nil {
    47                 sum = cur1!.val + cur2!.val + carryBit
    48                 cur1 = cur1!.next
    49                 cur2 = cur2!.next
    50             } else if cur1 != nil && cur2 == nil {
    51                 sum = cur1!.val + carryBit
    52                 cur1 = cur1!.next
    53             } else {
    54                 sum = cur2!.val + carryBit
    55                 cur2 = cur2!.next
    56             }
    57             
    58             carryBit = sum / 10
    59             let reminder = sum % 10
    60             
    61             let newNode = ListNode(reminder)
    62             
    63             if pre == nil {
    64                 head = newNode
    65             } else {
    66                 pre?.next = newNode
    67             }
    68             
    69             pre = newNode
    70         }
    71         
    72         if carryBit > 0 {
    73             let newNode = ListNode(carryBit)
    74             pre?.next = newNode
    75         }
    76         
    77         return head
    78     }
    79 }

    224ms

      1 /**
      2  * Definition for singly-linked list.
      3  * public class ListNode {
      4  *     public var val: Int
      5  *     public var next: ListNode?
      6  *     public init(_ val: Int) {
      7  *         self.val = val
      8  *         self.next = nil
      9  *     }
     10  * }
     11  */
     12 class Solution {
     13     func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
     14        
     15         var ls1Count = self.getListNodeArray(l1);
     16         var ls2Count = self.getListNodeArray(l2);
     17         var maxCount = max(ls1Count.count, ls2Count.count)
     18         var carry = 0
     19         var startNode : ListNode?
     20         var nextNode : ListNode?
     21         for i in 0..<maxCount{
     22             
     23             if(i >= ls1Count.count || i >= ls2Count.count)
     24             {
     25                 var val : Int = carry
     26                 if(i >= ls1Count.count)
     27                 {
     28                     val  += ls2Count[i]
     29                 }
     30                 else
     31                 {
     32                     val  += ls1Count[i]
     33                 }
     34                 if(val >= 10 )
     35                 {
     36                     val = val % 10
     37                     carry = 1
     38                 }
     39                 else {
     40                     carry = 0
     41                 }
     42                 let node = ListNode.init(val)
     43                 nextNode?.next = node
     44                 nextNode = node;
     45                 print(val);
     46             }
     47             else
     48             {
     49                 var val = ls2Count[i] + ls1Count[i] + carry
     50                 if(val >= 10 )
     51                 {
     52                     val = val % 10
     53                     carry = 1
     54                 }
     55                 else {
     56                     carry = 0
     57                 }
     58                 print(val);
     59                 let node = ListNode.init(val);
     60                 if(startNode  == nil)
     61                 {
     62                     startNode = node;
     63                 }
     64                 else
     65                 {
     66                     nextNode!.next = node;
     67                 }
     68                 nextNode = node;
     69                 
     70             }
     71         }
     72         if(carry == 1)
     73         {
     74             let node = ListNode.init(1);
     75             nextNode?.next = node;
     76         }
     77         let des  = self.getListNodeArray(startNode);
     78         var next2Node : ListNode?
     79         var start2Node : ListNode?
     80         for val in des{
     81                 
     82             let node = ListNode.init(val);
     83             if(start2Node  == nil)
     84             {
     85                 start2Node = node;
     86             }
     87             else
     88             {
     89                 next2Node!.next = node;
     90             }
     91             next2Node = node;
     92             
     93         }
     94         
     95         return start2Node;
     96         
     97     }
     98     
     99     
    100     func getListNodeArray(_ ls : ListNode?) -> [Int] {
    101         var lsCount :[Int] = []
    102         var nls = ls;
    103         while( nls != nil  )
    104         {
    105             lsCount.append(nls?.val as! Int)
    106             nls = nls?.next
    107         }
    108         
    109         var desCount : [Int] = []
    110         for (index,value) in lsCount.enumerated().reversed() {
    111             
    112             desCount.append(value)
    113          
    114         }
    115         
    116         return desCount
    117     }
    118 }
  • 相关阅读:
    基于短周期价量特征的多因子选股体系
    OnePy--构建属于自己的量化回测框架
    Should You Build Your Own Backtester?
    针对Quant的Python快速入门指南
    史上最全量化资源整理
    数字货币量化分析报告[2018-01-31]
    TuShare获取K线数据
    理工科背景如何转行量化交易?
    数字货币量化分析报告[2018-01-30]
    Ta-lib K线模式识别
  • 原文地址:https://www.cnblogs.com/strengthen/p/10339558.html
Copyright © 2020-2023  润新知