21. 合并两个有序链表

171 阅读1分钟

leetcode原题链接

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入: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
        }
    }