题目来自牛客网
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤𝑛≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000
要求:空间复杂度 𝑂(1)O(1),时间复杂度 𝑂(𝑛)O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
public ListNode Merge (ListNode pHead1, ListNode pHead2) {
// write code here
if(pHead1 == null) return pHead2;
if(pHead2 == null) return pHead1;
ListNode res =new ListNode(0);
ListNode p=res;
while(pHead1 !=null && pHead2!=null){
if(pHead1.val <=pHead2.val){
res.next =pHead1;
pHead1=pHead1.next;
}else{
res.next=pHead2;
pHead2=pHead2.next;
}
res=res.next;
}
if(pHead1==null){
res.next=pHead2;
}else{
res.next=pHead1;
}
return p.next;
}
}
这段代码实现了将两个有序链表合并为一个有序链表的功能。下面是对这段代码的解析:
- 首先判断两个输入链表是否为空,如果其中一个为空,则直接返回另一个链表。
- 创建一个新的链表头节点 res,并用指针 p 指向该头节点,用于构建合并后的链表。
- 使用 while 循环,遍历两个输入链表,直到其中一个链表为空。
- 在循环中,比较当前两个链表节点的值,将较小的节点接到 res 节点后面,并将指针移动到下一个节点。
- 循环结束后,将剩余的非空链表直接接到 res 节点后面。
- 返回合并后的链表的头节点,即 res 的下一个节点。
这段代码的时间复杂度为 O(m + n),其中 m 和 n 分别是两个输入链表的长度。因为只需要遍历一遍两个链表即可完成合并操作,所以时间复杂度是线性的。