一、合并两个排序的链表
1、递归
function Merge(pHead1, pHead2)
{
// write code here
if(!pHead1){
return pHead2
}else if(!pHead2){
return pHead1
}else if(pHead1.val < pHead2.val){
pHead1.next = Merge(pHead1.next, pHead2)
return pHead1
}else{
pHead2.next = Merge(pHead1, pHead2.next)
return pHead2
}
}
时间、空间复杂度O(m+n)
2、迭代
function ListNode(x){
this.val = x;
this.next = null;
}
function Merge(pHead1, pHead2)
{
// write code here
let node = new ListNode(-1);
let pre = node;
while(pHead1 !== null && pHead2 !== null){
if(pHead1.val <= pHead2.val){
pre.next = pHead1;
pHead1 = pHead1.next;
}else{
pre.next = pHead2;
pHead2 = pHead2.next;
}
pre = pre.next;
}
pre.next = pHead1 == null ? pHead2 : pHead1;
return node.next;
}
时间复杂度O(m+n) 空间复杂度O(1)
二、两个链表的第一个公共结点
1、双指针
function FindFirstCommonNode(pHead1, pHead2)
{
// write code here
let p1 = pHead1, p2 = pHead2;
while(p1 !== p2){
p1 = (p1 == null) ? pHead2 : p1.next;
p2 = (p2 == null) ? pHead1 : p2.next;
}
return p1;
}
时间复杂度O(m+n) 空间复杂度O(1)
2、哈希存储
function FindFirstCommonNode(pHead1, pHead2)
{
// write code here
let set = new Set();
while(pHead1 != null){
set.add(pHead1);
pHead1 = pHead1.next;
}
while(pHead2 != null){
if(set.has(pHead2) ) return pHead2;
pHead2 = pHead2.next;
}
return null;
}
时间复杂度O(m+n) 空间复杂度O(m)