我的思路是用双端队列存储,然后轮流取队尾和队头连接起来即可
代码如下:
public class Solution { public void reorderList(ListNode head) { Deque<ListNode> deque = new LinkedList<>(); while (head != null){ deque.add(head); head = head.next; } head = deque.removeFirst(); while (!deque.isEmpty()){ ListNode last = deque.removeLast(); head.next = last; head = head.next; if (deque.isEmpty()){ break; } ListNode first = deque.removeFirst(); head.next = first; head = head.next; } head.next = null; } }
结果:
官方给出的方法是:
代码如下:
class Solution {
public void reorderList(ListNode head) {
if (head == null) {
return;
}
ListNode mid = middleNode(head);
ListNode l1 = head;
ListNode l2 = mid.next;
mid.next = null;
l2 = reverseList(l2);
mergeList(l1, l2);
}
public ListNode middleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
public void mergeList(ListNode l1, ListNode l2) {
ListNode l1_tmp;
ListNode l2_tmp;
while (l1 != null && l2 != null) {
l1_tmp = l1.next;
l2_tmp = l2.next;
l1.next = l2;
l1 = l1_tmp;
l2.next = l1;
l2 = l2_tmp;
}
}
}