题目
代码
class Solution {
public void reorderList(ListNode head) {
int length = 0;
int splitLoc = 0; // 走几步进行切分
ListNode pre = head;
// 求长度
while (pre != null) {
length++;
pre = pre.next;
}
// 找切分位置
splitLoc = length / 2;
ListNode pre1 = head;
for (int i = 0; i < splitLoc; i++) {
pre1 = pre1.next;
}
ListNode ListB = pre1.next;
pre1.next = null;
ListNode reserveListB = reserve(ListB);
ListNode listNew = new ListNode(-1);
ListNode pre2 = head;
ListNode cur = listNew;
while (reserveListB != null) {
cur.next = pre2;
pre2 = pre2.next;
cur = cur.next;
cur.next = reserveListB;
reserveListB = reserveListB.next;
cur = cur.next;
}
// 第一段节点比第二段节点多的情况
if (pre2 != null) {
cur.next = pre2;
}
// return listNew.next;
}
private ListNode reserve(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode nextNode = cur.next;
cur.next = pre;
pre = cur;
cur = nextNode;
}
return pre;
}
}
官方写法:
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;
}
}
}