【剑指Offer】面试题25. 合并两个排序的链表

题目

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

限制:0 <= 链表长度 <= 1000

本题同【LeetCode】21. 合并两个有序链表

思路一:迭代

添加一个虚拟节点处理头结点。

代码

时间复杂度:O(m + n)
空间复杂度:O(1)

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (!l1 || !l2) return l1 ? l1 : l2;
        ListNode *newHead = new ListNode(-1), *pre = newHead;                
        while (l1 && l2) {
            if (l1->val <= l2->val) {
                pre->next = l1;
                l1 = l1->next;
            } else {
                pre->next = l2;
                l2 = l2->next;
            }
            pre = pre->next;
        }
        pre->next = l1 ? l1 : l2;
        return newHead->next;
        
    }
};

思路二:递归

代码

时间复杂度:O(m + n)
空间复杂度:O(1)

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (!l1 || !l2) return l1 ? l1 : l2;
        ListNode *newHead = nullptr;                
        if (l1->val <= l2->val) {
            newHead = l1;
            newHead->next = mergeTwoLists(l1->next, l2);
        } else {
            newHead = l2;
            newHead->next = mergeTwoLists(l1, l2->next);
        }
        return newHead;        
    }
};
posted @ 2020-04-06 21:49  Galaxy_hao  阅读(199)  评论(0编辑  收藏  举报