描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
示例1
输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}
示例2
输入:
{},{}
返回值:
{}
示例3
输入:
{-1,2,4},{1,3,4}
返回值:
{-1,1,2,3,4,4}
思路分析:
方法一:
使用递归来进行求解
- 终止条件:两链表其中一个为空时,返回另一个链表;
- 当前递归内容:若pHead1
.val <=
pHead2.val
将较小的pHead1.next
与merge后的表头连接,即pHead1.next = Merge(
pHead1.next,
pHead2);
pHead2.val
较大时同理; - 每次的返回值:排序好的链表头;
复杂度:O(m+n)
O(m+n)
代码:
import java.util.*;
public class Solution {
/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
public ListNode Merge (ListNode pHead1, ListNode pHead2) {
if(pHead1==null){
return pHead2;
}
if(pHead2==null){
return pHead1;
}
if(pHead1.val>pHead2.val){
pHead2.next=Merge(pHead1,pHead2.next);
return pHead2;
}else{
pHead1.next=Merge(pHead1.next,pHead2);
return pHead1;
}
}
}
方法二:
空间O(1)的思路:
-
创建一个虚拟结点和一个哨兵结点
-
当pHead1与pHead
2
都不为null
时循环 -
哪个的
val
小哪个赋给虚拟结点的next
,虚拟结点后移。 -
退出循环后,哪个pHead不为空,哪个结点(包括剩下的)给虚拟结点的
next
-
最后返回哨兵结点的
next
代码:
import java.util.*;
public class Solution {
/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
public ListNode Merge (ListNode pHead1, ListNode pHead2) {
ListNode dummy=new ListNode(-1);
ListNode res=dummy;
while(pHead1!=null&&pHead2!=null){
if(pHead1.val>pHead2.val){
dummy.next=pHead2;
pHead2=pHead2.next;
dummy=dummy.next;
}else if(pHead1.val<=pHead2.val){
dummy.next=pHead1;
pHead1=pHead1.next;
dummy=dummy.next;
}
}
if(pHead1!=null){
dummy.next=pHead1;
}
if(pHead2!=null){
dummy.next=pHead2;
}
return res.next;
}
}