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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//双端队列 Deque que = new LinkedList<>();
/**
* 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 ;
Deque<ListNode> que = new LinkedList<>();
ListNode p = head;
while(p!=null){
que.add(p);
p = p.next;
}
while(!que.isEmpty()){
if(p==null){
p = que.poll();
}else{
p.next = que.poll();
p = p.next;
}
p.next = que.pollLast();
p = p.next;
}
if(p!=null){
p.next=null;
}
}
}
//双指针
/**
* 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 || head.next.next==null) return ;
ListNode midP = midNode(head);
ListNode secP = midP.next;
midP.next = null;
ListNode right = reverseList(secP);
merge(head,right);
}
public ListNode midNode(ListNode head){
ListNode slow = head;
ListNode fast = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseList(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
public void merge(ListNode left, ListNode right){
while(left.next!=null && right!=null){
ListNode ltemp = left.next;
ListNode rtemp = right.next;
left.next = right;
right.next = ltemp;
left = ltemp;
right = rtemp;
}
}
}