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张表就是在两张表的基础上加一个递归