题目:
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}.
思路:用一个走两步的快指针和一个一次走一步的慢指针在快指针走在最后的,慢指针处于中间位置。然后把后面一半翻转了,再将后面的链表和前面的链表合并即可。
代码:
/** * Definition for singly-linked list. * 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 slow = head; ListNode fast = head; while(fast.next!=null && fast.next.next!=null){ fast = fast.next.next; slow = slow.next; } ListNode pre = slow.next; if(pre != null && pre.next != null){ ListNode nex = pre.next; while (nex != null){ pre.next = nex.next; nex.next = slow.next; slow.next = nex; nex = pre.next; } } merge(head,slow); } public void merge(ListNode head,ListNode slow){ ListNode p=head; ListNode q=slow.next; while(q!=null&&p!=null){ slow.next=q.next; q.next=p.next; p.next=q; q=slow.next; p=p.next.next; } } }