首先找到中间节点,然后逆序中点后面的链表,然后合并。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
//首先获取后面的长度
if (head == null || head.next == null)
return;
//找到要排序列表的下一个
ListNode begin, end;
begin = end = head;
while (end.next != null && end.next.next != null) {
begin = begin.next;
end = end.next.next;
}
//此时begin就是中点
//但是因为要反转,所以begin往下
// begin = begin.next;
if (begin.next != null) {
ListNode pre = begin;
begin = begin.next;
pre.next = null;
ListNode p = begin;
ListNode q = begin.next;
p.next = null;
while (q != null) {
ListNode r = q.next;
q.next = p;
p = q;
q = r;
}
//此时begin已经反转并且孤立了
ListNode p1 = head;
ListNode p2 = p;
while (p1 != null && p2 != null) {
ListNode tmp_p1 = p1.next;
ListNode tmp_p2 = p2.next;
p1.next = p2;
p2.next = tmp_p1;
p1 = tmp_p1;
p2 = tmp_p2;
}
}
}
}