LeetCode 21. 合并两个有序链表

房东的猫 提交于 2020-08-17 06:26:02

我的LeetCode:https://leetcode-cn.com/u/ituring/

我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii

LeetCode 21. 合并两个有序链表

题目

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

思路1-迭代

注意保留头结点用以返回;

算法复杂度: n为两个链表的总长

  • 时间复杂度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
  • 空间复杂度: $ {\color{Magenta}{\Omicron\left(1\right)}} $

思路2-递归

递归代码比较简短;

算法复杂度: n为两个链表的总长

  • 时间复杂度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
  • 空间复杂度: $ {\color{Magenta}{\Omicron\left(n\right)}} $

算法源码示例

package leetcode;

/**
 * @author ZhouJie
 * @date 2020年1月6日 下午11:40:27 
 * @Description: 21. 合并两个有序链表
 *
 */
public class LeetCode_0021 {

}

// Definition for singly-linked list.
class ListNode_0021 {
	int val;
	ListNode_0021 next;

	ListNode_0021(int x) {
		val = x;
	}
}

class Solution_0021 {
	/**
	 * @author: ZhouJie
	 * @date: 2020年5月22日 下午9:30:41 
	 * @param: @param l1
	 * @param: @param l2
	 * @param: @return
	 * @return: ListNode_0021
	 * @Description: 1-迭代;
	 *
	 */
	public ListNode_0021 mergeTwoLists_1(ListNode_0021 l1, ListNode_0021 l2) {
		if (l1 == null || l2 == null) {
			return l1 == null ? l2 : l1;
		}
		ListNode_0021 dummy = new ListNode_0021(0);
		ListNode_0021 node = dummy;
		while (l1 != null && l2 != null) {
			if (l1.val < l2.val) {
				dummy.next = l1;
				dummy = l1;
				l1 = l1.next;
			} else {
				dummy.next = l2;
				dummy = l2;
				l2 = l2.next;
			}
		}
		dummy.next = l1 == null ? l2 : l1;
		return node.next;
	}

	/**
	 * @author: ZhouJie
	 * @date: 2020年5月22日 下午9:30:51 
	 * @param: @param l1
	 * @param: @param l2
	 * @param: @return
	 * @return: ListNode_0021
	 * @Description: 2-递归;
	 *
	 */
	public ListNode_0021 mergeTwoLists_2(ListNode_0021 l1, ListNode_0021 l2) {
		if (l1 == null) {
			return l2;
		} else if (l2 == null) {
			return l1;
		} else if (l1.val < l2.val) {
			l1.next = mergeTwoLists_2(l1.next, l2);
			return l1;
		} else {
			l2.next = mergeTwoLists_2(l1, l2.next);
			return l2;
		}
	}
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!