LeetCode021——合并两个有序链表

我的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解题报告:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值