题目

思路
代码
- 边界情况:在分离奇偶节点时,当节点数为偶数个时,倒数第二节点.next会指向倒数第一节点,但需要指向null。节点数为奇数个没事

class ReorderList {
public static class ListNode {
public int val;
public ListNode next;
public ListNode() {}
public ListNode(int val) {
this.val = val;
}
}
public static ListNode reorderList(ListNode head) {
ListNode evenHead = head.next;
ListNode cur1 = head;
ListNode cur2 = evenHead;
while (cur1.next != null && cur2.next != null) {
cur1.next = cur1.next.next;
cur2.next = cur2.next.next;
cur1 = cur1.next;
cur2 = cur2.next;
}
cur1.next = null;
cur2.next = null;
return mergeTwoList(head, reverseList(evenHead));
}
public static ListNode mergeTwoList(ListNode node1, ListNode node2) {
ListNode dummy = new ListNode();
ListNode cur = dummy;
while (node1 != null && node2 != null) {
if (node1.val < node2.val) {
cur.next = node1;
node1 = node1.next;
} else {
cur.next = node2;
node2 = node2.next;
}
cur = cur.next;
}
if (node1 != null) {
cur.next = node1;
}
if (node2 != null) {
cur.next = node2;
}
return dummy.next;
}
public static ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
public static void printList(ListNode head) {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val + "->");
cur = cur.next;
}
System.out.println("Null");
}
public static ListNode buildList(int[] nums) {
ListNode dummy = new ListNode();
ListNode cur = dummy;
for (int i = 0; i < nums.length; i++ ) {
cur.next = new ListNode(nums[i]);
cur = cur.next;
}
return dummy.next;
}
public static void main(String[] args) {
int[] nums = new int[]{1,8,3,6,5,4,7,2,9,0};
ListNode head = buildList(nums);
ListNode res = reorderList(head);
printList(res);
}
}