我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/description/
题目描述:
知识点:链表
思路一:迭代实现归并排序的子过程
学习过归并排序的人肯定知道,本题其实是归并排序中的归并过程。设立一个包含虚拟头节点dummyHead的新链表来保存合并后的结果。设立两个指针cur1和cur2来分别遍历链表l1和l2,只要cur1和cur2中有一个不为null,合并过程就将继续。注意在while循环里用的是if-else语句,即执行一种情况后就令cur指针移位进入下一次循环。
时间复杂度是O(m + n),其中m为链表l1的节点数,n为链表l2的节点数。由于整个过程只涉及到指针层面的操作,空间复杂度为O(1)。
JAVA代码:
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode cur1 = l1;
ListNode cur2 = l2;
ListNode dummyHead = new ListNode(-1);
ListNode cur = dummyHead;
while(cur1 != null || cur2 != null) {
if(cur1 == null) {
cur.next = cur2;
cur2 = cur2.next;
}else if(cur2 == null) {
cur.next = cur1;
cur1 = cur1.next;
}else if(cur1 != null && cur2 != null) {
if(cur1.val > cur2.val) {
cur.next = cur2;
cur2 = cur2.next;
}else {
cur.next = cur1;
cur1 = cur1.next;
}
}
cur = cur.next;
}
return dummyHead.next;
}
}
LeetCode解题报告:
思路二:递归实现归并排序的子过程
递归的终止条件:
(1)当l1为空时,直接返回l2。
(2)当l2位空时,直接返回l1。
递归的过程:
(1)当l1的值大于l2的值时,我们令l2指向合并好l1和l2.next的结果,并返回l2。
(2)当l1的值小于等于l2的值时,我们令l1指向合并好l1.next和l2的结果,并返回l1。
时间复杂度是O(min(m, n))级别的,其中m为链表l1的节点数,n为链表l2的节点数。而空间复杂度和递归深度有关,也是O(min(m, n))级别的。
JAVA代码:
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) {
return l2;
}
if(l2 == null) {
return l1;
}
if(l1.val > l2.val) {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}else {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
}
}
LeetCode解题报告: