做题记录
快慢指针+反转链表+合并链表
代码实现:
public void reorderList(ListNode head) {
if(head==null || head.next==null || head.next.next==null){
return;
}
ListNode pre = new ListNode(0, head);
ListNode fast = pre, slow = pre;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode curB = slow.next;
slow.next = null;
//反转链表
curB = reverseList(curB);
ListNode nB = curB.next;
ListNode curA = head;
ListNode nA = curA.next;
while (nA != null) {
curA.next = curB;
curB.next = nA;
curA = nA;
curB = nB;
nA = nA.next;
if (nB != null) {
nB = nB.next;
}
}
curA.next = curB;
}
public static ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode next = head.next;
while (next != null) {
cur.next = pre;
pre = cur;
cur = next;
next = next.next;
}
cur.next = pre;
return cur;
}