Open songyy5517 opened 1 year ago
思路1:递归
复杂度分析
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 0. 特殊值处理/递归出口
if (l1 == null || l2 == null)
if (l1 == null)
return l2;
else
return l1;
// 1. 创建合并后的链表
ListNode head = new ListNode(); // 递归方法中无需设置伪头节点(2023/2/8)
// 2. 递归合并链表
if (l1.val <= l2.val){
head.val = l1.val;
head.next = mergeTwoLists(l1.next, l2);
}
else{
head.val = l2.val;
head.next = mergeTwoLists(l1, l2.next);
}
// 3. 返回合并后链表的头节点
return head;
}
}
思路2:循环合并
复杂度分析:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 10:17-
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
public ListNode Merge (ListNode pHead1, ListNode pHead2) {
// write code here
// 思路:循环比较。
// 1. 异常处理
if (pHead1 == null || pHead2 == null)
return pHead1 == null ? pHead2 : pHead1;
// 2. 定义双指针
ListNode p1 = pHead1, p2 = pHead2;
ListNode pseudo_head = new ListNode(0); // 伪头节点
ListNode res = pseudo_head; // 最终链表
// 3. 比较链表元素
while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
res.next = p1;
p1 = p1.next;
} else {
res.next = p2;
p2 = p2.next;
}
res = res.next;
}
res.next = p1 == null ? p2 : p1;
return pseudo_head.next; // 返回伪头节点以外的节点
}
}
2023/2/8 思路2:循环合并
思路1:递归合并
2024/1/13
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
分析 根据题意,一个很直接的想法就是比较从头到尾链表,将每次的较小值放入新链表中。