为神马面试的时候撕不出来??!!!o(╥﹏╥)o
思路:取两个链表的第一个数比较,小的那个添加到新链表,然后指针向后移动,第二个数再与另一个链表的第一个数比较,以此类推。。。就是那个链表中的数被添加到新链表中,那个链表的指针就向后移动
/*数据结构
{
value:1,
next:{...}
}
*/
//合并函数
function merge(p1,p2){
let next={};//相当于尾指针
let result=next; //相当于头指针
while(p1!=null&&p2!=null){
let newNode={value:null,next:null}; //创建新节点
let a=p1.value;
let b=p2.value;
if(a<b){
next.next=newNode; //让尾指针的下一个指向新节点
newNode.value=a;
next=newNode; //更新尾指针到新节点
p1=p1.next;
}else{
next.next=newNode;
newNode.value=b;
next=newNode;
p2=p2.next;
}
}
//两个链表长度不等时,把长的那个链表剩余的项加入新链表
if(p2!=null){
while(p2!=null){
let newNode={value:null,next:null};
next.next=newNode;
newNode.value=p2.value;
next=newNode;
p2=p2.next;
}
}
if(p1!=null){
while(p1!=null){
let newNode={value:null,next:null};
next.next=newNode;
newNode.value=p1.value;
next=newNode;
p1=p1.next;
}
}
return result.next;
}
//简单的打印函数
function print(p){
let arr=[];
while(p!=null){
arr.push(p.value);
p=p.next;
}
return arr.join('');
}
//测试数据
let p1={
value:1,
next:{
value:2,
next:{
value:5,
next:null
}
}
}
let p2={
value:3,
next:{
value:4,
next:{
value:7,
next:{
value:9,
next:null
}
}
}
}
let p=merge(p1,p2);
console.log(print(p));//1234579
升华版
function ListNode(val) {
this.val = val;
this.next = null;
}
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
let curr=new ListNode(null);
let h=curr;
while(l1!=null||l2!=null){
if(l1==null&&l2!=null){
curr.next=new ListNode(l2.val);
curr=curr.next;
l2=l2.next;
}else if(l2==null&&l1!=null){
curr.next=new ListNode(l1.val);
curr=curr.next;
l1=l1.next;
}else{
if(l2.val<=l1.val){
curr.next=new ListNode(l2.val);
curr=curr.next;
l2=l2.next;
}else{
curr.next=new ListNode(l1.val);
curr=curr.next;
l1=l1.next;
}
}
}
return h.next;
};