NC2 重排链表
解法一: 栈 + 合并链表
-
先遍历一遍链表,放在数组
stack
中,得到链表长度len
-
指针
q
用来遍历链表,next
用来存q
的下一位 -
newHead
作为新的头,rear
表示链表的尾部,使用尾插法 -
cnt
表示q
走到了哪里,走到链表的一半就可以停下 -
当
top
和q
相等时 ,表明链表有奇数个节点并且当前是中点的位置,此时只插入一个节点即可 -
一般情况先插入
q
再插入top
-
q
指向它自己的next
,cnt + 1
-
最后返回
newHead
/* * function ListNode(x){ * this.val = x; * this.next = null; * } */ /** * * @param head ListNode类 * @return void */ function reorderList( head ) { if(!head || !head.next) return head let stack = [] let p = head let len = 0 while(p != null){ stack.push(p) p = p.next len ++ } let q = head let next = null let cnt = 1 let newHead = null let rear = null while(q != null && cnt <= Math.ceil(len/2)){ let top = stack.pop() console.log(q.val , top.val) if(top == q){ if(newHead == null){ newHead = top rear = top }else{ rear.next = top rear = top } }else{ if(newHead == null){ newHead = q next = q.next q.next = top rear = top }else{ rear.next = q next = q.next q.next = top rear = top } } q = next cnt ++ } rear.next = null return newHead } module.exports = { reorderList : reorderList };
解法二:寻找链表中点 + 逆序 + 双指针合并链表
- 使用快慢指针来确定链表的中点,
p1
为慢指针,p2
为快指针 - 当链表有奇数个节点的时候,遍历之后,
p1
刚好指向中间的节点,p2
指向最后一个节点的next
,也就是null
- 当链表有偶数个节点的时候,遍历之后,
p1
指向第n/2
的节点,p2
指向最后一个节点 - 将
p1
到最后这一段节点逆序:- 注意:逆序之前一定要将p1的next置为null要不然就进入闭环了
pre
为前一个节点cur
为当前节点next
保存下一个节点
- 逆序后cur指向最后一个节点,使用p指针指向第一个节点
- 当cur与p相等的时候,表明链表时奇数个节点并且同时指向了中点,这时只需要添加一次即可
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @return void
*/
function reorderList( head ) {
if(!head || !head.next) return head
let p1 = head
let p2 = head.next
while(p2 != null && p2.next != null){
p1 = p1.next
p2 = p2.next.next
}
let pre = p1
let cur = p1
let next = p1.next
pre.next = null
while(next != null){
cur = next
next = cur.next
cur.next = pre
pre = cur
}
let p = head
let newHead = null
let rear
let next1
let next2
while(p != null){
if(p == cur){
if(newHead == null){
newHead = p
rear = p
}else{
rear.next = p
rear = p
}
break
}else{
if(newHead == null){
newHead = p
next1 = p.next
p.next = cur
next2 = cur.next
rear = cur
}else{
rear.next = p
next1 = p.next
p.next = cur
next2 = cur.next
rear = cur
}
p = next1
cur = next2
}
}
rear.next = null
return newHead
}
module.exports = {
reorderList : reorderList
};