Algorithem_MergeTwoSortedLists#
2 つのソートされたリンクリスト list1 と list2 が与えられます。
2 つのリストを 1 つのソートされたリストにマージします。リストは、最初の 2 つのリストのノードを結合して作成する必要があります。
マージされたリンクリストのヘッドを返します。
例 1:
Input: list1 = [1,2,4], list2 = [1,3,4]
Output: [1,1,2,3,4,4]
例 2:
Input: list1 = [], list2 = []
Output: []
例 3:
Input: list1 = [], list2 = [0]
Output: [0]
解法#
2 つのソートされたリンクリストをマージする必要があるため、解法は次のとおりです。
- list1.val と list2.val の値を比較します。
- もし list1.val が list2.val 以下であれば、最初の要素は list1.val であり、次に list1.next と list2 を再帰的に比較します。
- もし list1.val が list2.val よりも大きければ、最初の要素は list2.val であり、次に list1 と list2.next を再帰的に比較します。
- もし list1 が空であれば、list2 を返し、もし list2 が空であれば、list1 を返します。
以下はコードです:
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? {
if list1 == nil {
return list2
}
if list2 == nil {
return list1
}
if list1!.val <= list2!.val {
list1?.next = mergeTwoLists(list1?.next, list2)
return list1
}
else {
list2?.next = mergeTwoLists(list1, list2?.next)
return list2
}
}
}