链表反转 && 合并N张表的递归写法

let pre,next=null
while(pHead){
    next=pHead.next
    pHead.next= pre
    
    pre=pHead
    pHead=next
}
return pre
    

维护的两个变量:

        (1)pre: 前置节点
        (2)pHead:当前节点
        每次循环这两个变量都要更新
当前节点反转: 

        pHead.next=pre
补充术语:

        常说的让当前指针指向前置节点, 及时pHead.next=pre. 让谁指向谁就是谁.next=谁

2.0版本-进阶

合并两个有序链表, 要求空间O(1), 时间O(n)

// 合并两张表
function merge(l1,l2){
    let head = new ListNode(0)
    let cur = head,p1=l1,p2=l2
    if(!l2) return l1
    if(!l1) return l2
    while(p1 && p2){
        if(p1.val <p2.val){
            cur.next = p1
            p1 = p1.next
        } else {
            cur.next = p2
            p2=p2.next
        }
        cur = cur.next
    }
//     cur.next = p1==null?p2:p1
    cur.next = p1 ?p1:p2
    return head.next
}

进阶3.0 合并N和有序表 要求空间O(n), 时间O(nlogk)

function mergeKLists( lists ) {
    return mergeAll(lists,0,lists.length-1);
    
}
function mergeAll(list, start,end){
        if(start==end){return list[start]}
        if(start>end){return null}
        let mid = Math.floor((start+end)/2); // 0,2 3,4
        // 递归 每次合并前一半和后一半
        return merge(mergeAll(list,start,mid),mergeAll(list,mid+1,end))
}

// 合并两张表
function merge(l1,l2){
    let head = new ListNode(0)
    let cur = head,p1=l1,p2=l2
    if(!l2) return l1
    if(!l1) return l2
    while(p1 && p2){
        if(p1.val <p2.val){
            cur.next = p1
            p1 = p1.next
        } else {
            cur.next = p2
            p2=p2.next
        }
        cur = cur.next
    }
//     cur.next = p1==null?p2:p1
    cur.next = p1 ?p1:p2
    return head.next
}

补充, 只要会写合并两张表, 就会写合并N张表. 合并N张表就是在两张表的基础上加一个递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值