为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists

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

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14         
15         if lists.count == 0 {
16             return nil
17         }
18         var ar = [Int]()
19         
20         for i in 0..<lists.count {
21             var node = lists[i]
22             
23             while node != nil {
24                 ar.append(node!.val)
25                 node = node!.next
26             }
27         }
28         
29         if ar.count == 0 {
30             return nil
31         }
32         
33         ar = ar.sorted()
34         
35         var head = ListNode(ar[0])
36         var node = head
37         for i in 1..<ar.count {
38             node.next = ListNode(ar[i])
39             node = node.next!
40         }
41         
42         return head
43     }
44 }

76ms

 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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14     guard !lists.isEmpty else {
15         return nil
16     }
17 
18     var values = [Int]()
19     for list in lists {
20         var head = list
21         while head != nil {
22             values.append(head!.val)
23             head = head!.next
24         }
25     }
26 
27     values = values.sorted()
28     print(values)
29     let result = ListNode(0)
30     var temp: ListNode? = result
31     for value in values {
32         temp?.next = ListNode(value)
33         temp = temp?.next
34     }
35 
36     return result.next
37 }
38 }

84ms

 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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14         guard !lists.isEmpty else { return nil }
15         guard lists.count > 1 else { return lists[0] }
16         let left = mergeKLists(Array(lists[0..<(lists.count / 2)]))
17         let right = mergeKLists(Array(lists[((lists.count / 2))...]))
18         return mergeTwoLists(left, right)
19     }
20     
21     func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
22         let prehead = ListNode(-1)
23         var prev: ListNode? = prehead
24         var l1Node: ListNode? = l1
25         var l2Node: ListNode? = l2
26         while let l1 = l1Node, let l2 = l2Node {
27             if l1.val <= l2.val {
28                 prev?.next = l1
29                 l1Node = l1.next
30             } else {
31                 prev?.next = l2
32                 l2Node = l2.next
33             }
34             prev = prev?.next
35         }
36 
37         prev?.next = l1Node ?? l2Node;
38 
39         return prehead.next
40     }
41 }

116ms

 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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14         guard lists.count > 0 else{
15             return nil
16         }
17         var left = 0
18         var right = lists.count - 1
19         var _lists = lists
20         while right > 0 {
21             left = 0
22             while left < right {
23                 _lists[left] = merge2Lists(_lists[left], _lists[right])
24                 left += 1
25                 right -= 1
26             }
27         }
28         return _lists[0]
29     }
30     
31     func merge2Lists(_ l1: ListNode?, _ l2: ListNode?) ->ListNode? {
32         let dummy = ListNode(0)
33         var node = dummy
34     
35         var l1 = l1
36         var l2 = l2
37         
38         while l1 != nil && l2 != nil {
39             if l1!.val < l2!.val {
40                 node.next = l1
41                 l1 = l1!.next
42             } else {
43                 node.next = l2
44                 l2 = l2!.next
45             }
46             
47             node = node.next!
48         }
49         
50         node.next = l1 ?? l2
51         
52         return dummy.next
53     }
54 }

120ms

 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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14         if lists.count == 0 {
15             return nil;
16         }
17         var listArray = [ListNode]()
18         for listNode in lists {
19             var listNode = listNode
20             while listNode != nil {
21                 listArray.append(listNode!);
22                 listNode = listNode?.next;
23             }
24         }
25         if listArray.count < 1 {
26             if listArray.count == 0 {
27                 return nil
28             } else {
29                 return listArray[0]     
30             }
31         }
32         listArray.sort { (list1, list2) -> Bool in
33             list1.val < list2.val
34         }
35         for index in 0 ..< (listArray.count - 1) {
36             let node = listArray[index]
37             node.next = listArray[index + 1]
38         }
39         let node = listArray[listArray.count - 1]
40         node.next = nil;
41         return listArray[0]
42     }
43 }

 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 mergeKLists(_ lists: [ListNode?]) -> ListNode? {
14         var resultNumbers = [Int]()
15         for linkedList in lists {
16             var currentNode = linkedList
17             while currentNode != nil {
18                 resultNumbers.append(currentNode!.val)
19                 currentNode = currentNode!.next
20             }
21         }
22         resultNumbers = resultNumbers.sorted()
23         
24         var result = ListNode(-1)
25         var currentResultNode = result
26         for num in resultNumbers {
27             currentResultNode.next = ListNode(num)
28             currentResultNode = currentResultNode.next!
29         }
30         
31         return result.next
32     }
33 }

140ms

 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 
13 class Solution {
14     
15     func mergeKLists(_ lists: ArraySlice<ListNode?>) -> ListNode? {
16         let count = lists.endIndex - lists.startIndex
17         guard count > 1 else { return lists.first ??  nil }
18         var nodeOptional1 = lists[lists.startIndex]
19         var nodeOptional2 = lists[lists.startIndex+1]
20         if count > 2 {
21             let midIndex = lists.startIndex + count/2
22             nodeOptional1 = mergeKLists(lists[lists.startIndex..<midIndex])
23             nodeOptional2 = mergeKLists(lists[midIndex..<lists.endIndex])
24         }
25         guard var node1 = nodeOptional1, var node2 = nodeOptional2 else { return nodeOptional1 ?? nodeOptional2 } 
26         let firstVal = min(node1.val, node2.val)
27         var root = ListNode(firstVal)
28         
29         // so that second has a chance
30         let dummieNode = ListNode(0)
31         if node1.val < node2.val {
32             dummieNode.next = node2
33             node2 = dummieNode
34         } else {
35             dummieNode.next = node1
36             node1 = dummieNode
37         }
38         var currentNode = root
39         while let next1 = node1.next, let next2 = node2.next {
40             // print("next vals:", next1.val, next2.val, currentNode!.val)
41             if next1.val < next2.val {
42                 let newNode = ListNode(next1.val)
43                 currentNode.next = newNode
44                 currentNode = newNode
45                 node1 = next1
46             } else {
47                 let newNode = ListNode(next2.val)
48                 currentNode.next = newNode
49                 currentNode = newNode
50                 node2 = next2
51             }
52         }
53         // print("next:", (node1?.next ?? node2?.next)!.val)
54         currentNode.next = node1.next ?? node2.next
55         return root
56     }
57     
58     func mergeKLists(_ lists: [ListNode?]) -> ListNode? {
59         return mergeKLists(lists[lists.startIndex..<lists.endIndex])
60     }
61 }

posted @ 2018-11-01 19:47  为敢技术  阅读(616)  评论(0编辑  收藏  举报