题目
list奇数位升序,偶数位降序,让链表变成升序的。
比如: 1->3->4->2调整为1->2->3->4
思路
这是一道非常好的锻炼链表基本操作的题目,要充分利用好奇偶各自有序的特性,链表拆分,链表转置,链表归并
show me your code
public static ListNode sortLinkedList(ListNode head) {
// 拆分
ListNode[] divided = divide(head);
ListNode jHead = divided[0];
ListNode oHead = divided[1];
// 链表倒置
ListNode reversedONode = reverse(oHead.next);
// 双指针合并
return merge(reversedONode, jHead.next);
}
public static ListNode[] divide(ListNode head) {// 拆分
ListNode jHead = new ListNode();
ListNode oHead = new ListNode();
int i = 1;
ListNode jCur = jHead;
ListNode oCur = oHead;
while (head != null) {
// 偶
if (i % 2 == 0) {
oCur.next = head;
oCur = oCur.next;
} else {// 奇
jCur.next = head;
jCur = jCur.next;
}
head = head.next;
i++;
}
// 收尾
jCur.next = null;
oCur.next = null;
return new ListNode[]{jHead, oHead};
}
public static ListNode reverse(ListNode head) { // 倒置
ListNode preNode = null;
while (head != null) {
ListNode curNextNode = head.next;
head.next = preNode;
preNode = head;
head = curNextNode;
}
return preNode;
}
public static ListNode merge(ListNode leftHead, ListNode rightHead) { // 归并
ListNode result = new ListNode();
ListNode resultCur = result;
while (leftHead != null && rightHead != null) {
if (leftHead.val < rightHead.val) {
resultCur.next = leftHead;
leftHead = leftHead.next;
} else {
resultCur.next = rightHead;
rightHead = rightHead.next;
}
resultCur = resultCur.next;
}
if (leftHead != null) {
resultCur.next = leftHead;
}
if (rightHead != null) {
resultCur.next = rightHead;
}
return result.next;
}