题目链接
法一(快)
private ListNode findMiddleNode(ListNode head) {
ListNode slow = head, fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
private ListNode reverseList(ListNode afterHead) {
ListNode pre = null, cur = afterHead, next = null;
while (cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
private void mergeList(ListNode frontHead, ListNode afterHead) {
ListNode frontNext, afterNext;
while (frontHead != null && afterHead != null) {
frontNext = frontHead.next;
afterNext = afterHead.next;
frontHead.next = afterHead;
frontHead = frontNext;
afterHead.next = frontHead;
afterHead = afterNext;
}
}
public void reorderList_1(ListNode head) {
if (head == null || head.next == null) {
return;
}
ListNode mid = findMiddleNode(head);
ListNode frontHead = head, afterHead = mid.next;
mid.next = null;
afterHead = reverseList(afterHead);
mergeList(frontHead, afterHead);
}
法二(双端队列)
public void reorderList_2(ListNode head) {
Deque<ListNode> deque = new LinkedList<>();
ListNode cur = head;
while (cur != null) {
deque.addLast(cur);
cur = cur.next;
}
while (!deque.isEmpty()) {
if (cur == null) {
cur = deque.pollFirst();
} else {
cur.next = deque.pollFirst();
cur = cur.next;
}
cur.next = deque.pollLast();
cur = cur.next;
}
if (cur != null) {
cur.next = null;
}
}
本地测试
lay.showTitle(143);
Solution143 sol143 = new Solution143();
int[] nums143 = new int[]{1, 2, 3, 4, 5};
ListNode head143 = new ListNode();
head143 = listOpt.creatListByArray(head143, nums143);
listOpt.showList(head143);
sol143.reorderList_1(head143.next);
listOpt.showList(head143);
sol143.reorderList_2(head143.next);
listOpt.showList(head143);