Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public void reorderList(ListNode head) { if (head == null || head.next == null) return; ListNode slow = head, fast = head, prev = null; while (fast != null && fast.next != null) { prev = slow; slow = slow.next; fast = fast.next.next; } prev.next = null; // cut at middle slow = reverse(slow); // merge two lists ListNode curr = head; while (curr.next != null) { ListNode tmp = curr.next; curr.next = slow; slow = slow.next; curr.next.next = tmp; curr = tmp; } curr.next = slow; } public ListNode reverse(ListNode head){ ListNode prev = null; ListNode cur = head; while(cur != null){ ListNode next = cur.next; cur.next = prev; prev = cur; cur = next; } return prev; } }
可以找到中间节点,断开,把后半截单链表reverse一下,再合并两个单链表。