题目描述
将给定的单链表L: L 0→L 1→…→L n-1→L n,
重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→…
要求使用原地算法,并且不改变节点的值
例如:
对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}.
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…
You must do this in-place without altering the nodes' values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.
解题思路:先找到链表的中点,将链表后半段逆序,然后再间隔插入到前段链表。
这里涉及到快慢指针的问题
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class Solution {
public void reorderList(ListNode head) {
if(head==null||head.next==null)return;
ListNode fast=head;
ListNode slow=head;
while(fast.next!=null&&fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
ListNode p=slow.next;
slow.next=null;
ListNode pH=p;
p=p.next;
pH.next=null;
while(p!=null){
ListNode q=p.next;
p.next=pH;
pH=p;
p=q;
}
ListNode pp=head;
while(pH!=null){
ListNode qq=pH.next;
pH.next=pp.next;
pp.next=pH;
pp=pp.next.next;
pH=qq;
}
}
}