力扣题目
解题思路
java代码
力扣题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
解题思路:
-
递归法:
- 首先判断两个链表是否为空,如果其中一个为空,则返回另一个。
- 比较两个链表当前节点的值,较小的节点作为当前节点,然后其
next
指针指向递归调用后的结果。 - 递归地对剩余的链表进行合并操作,直到其中一个链表为空。
- 最后返回非空的那个链表。
-
迭代法:
- 创建一个哨兵节点,用于简化边界条件的处理。
- 使用两个指针分别遍历两个链表,比较当前节点的值,将较小节点的指针赋值给哨兵节点的
next
指针,并移动较小节点的指针。 - 继续遍历,直到一个链表遍历完成。
- 将未遍历完的链表接到哨兵节点的
next
指针后面。
- 归法的优点是代码简洁,逻辑清晰,缺点是如果链表过长,可能会导致栈溢出。而迭代法可以避免栈溢出的问题,但代码相对复杂。
java代码:
package org.example;
public class Leetcode21 {
public static void main(String[] args) {
Leetcode21 leetcode21 = new Leetcode21();
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
ListNode listNode = leetcode21.mergeTwoLists(l1, l2);
}
// 递归 ,递归的终止条件是 l1 == null || l2 == null
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if (l1.val < l2.val)
{
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
else
{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
/**
* 迭代
* @param l1
* @param l2
* @return
*/
private ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode prev = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
prev.next = l1 == null ? l2 : l1;
return dummy.next;
}
}
更多详细内容同步到公众号,感谢大家的支持!
并且没有任何收费项