Leetcode刷题地址:https://leetcode-cn.com/problemset/lcof/
题目
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:0 <= 链表长度 <= 1000
Solution 1
以其中一个链表作为基准链表,和另一个链表每个元素一一比较,在合适的位置修改指针,最终返回第一个链表。
时间:O(n1 + n2),其中n1和n2分别代表两个链表的长度;
空间:O(1)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
else if (!l2) return l1;
ListNode* first = l1;
ListNode* second = l2;
ListNode* head = l1; // 返回链表的头结点
ListNode* tmp;
// 将较小值的链表作为输出链表
if (first->val > second->val) {
first = l2;
second = l1;
head = l2;
}
while (first && second) {
if (first->val <= second->val) {
tmp = first; // 保证tmp指向first链表当前结点的前一个结点,以便加入结点
first = first->next;
} else {
// 将second当前结点加入first中
ListNode* t = second->next;
second->next = tmp->next;
tmp->next = second;
tmp = tmp->next;
second = t;
}
}
// 将second剩下的结点加入fisrt链表的末尾
if (second) {
tmp->next = second;
}
return head;
}
结果:
Solution 2
递归,基本思路就是将mergeTwoList函数功能看作能够将输入的两个链表合并成有序链表,并返回有序链表的头部。那么我们就可以定义递归式,为首先判断输入两个链表的头结点值大小,将较小的那个作为输出链表的头结点,然后递归调用mergeTwoList将较小的那个链表的next指针指向的子链表和另外一个链表合并为有序链表,并且接到输出链表的next上。
时间:O(n1 + n2),其中n1和n2分别代表两个链表的长度;
空间:O(1)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
else if (!l2) return l1;
ListNode* head = NULL;
if (l1->val <= l2->val) {
head = l1;
head->next = mergeTwoLists(head->next, l2);
} else {
head = l2;
head->next = mergeTwoLists(l1, head->next);
}
return head;
}
结果: