将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
迭代
思路
依次比较两个链表中的数大小然后添加链表即可.技巧是可以先创建一个头结点,然后返回这个头结点的next,这样就比较容易实现
func mergeTwoLists1(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var l1 = l1
var l2 = l2
let head = ListNode(-1)
var temp = head
while l1 != nil && l2 != nil {
if l1!.val <= l2!.val {
temp.next = l1
l1 = l1!.next
} else {
temp.next = l2
l2 = l2!.next
}
temp = temp.next!
}
temp.next = l1 == nil ? l2:l1;
return head.next;
}
递归
思路:
第一步:从链表1中取出第一个元素,记为L1,与链表2的第一个元素(记为L2)进行对比,较小的值排在新的链表的头节点,如果 L1 >= L2,将L2作为新链表的头节点,否则将L1作为新链表的头节点,然后将已操作链表的后续节点递归与另一链表进行对比
///递归
func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
if l1 == nil {
return l2
} else if l2 == nil {
return l1
} else if l1!.val <= l2!.val {
l1?.next = mergeTwoLists(l1?.next, l2)
return l1
} else {
l2?.next = mergeTwoLists(l1, l2?.next)
return l2
}
}