NC207 排序奇升偶降链表
描述
给定一个奇数位升序,偶数位降序的链表,返回对其排序后的链表。
题面解释:例如链表 1->3->2->2->3->1 是奇数位升序偶数位降序的链表,而 1->3->2->2->3->2 则不符合题目要求。
分析
- 首先使用“leetcode328. 奇偶链表”的解法,将链表分解为奇偶两个链表。
- 然后使用反转偶数链变成上升
- 合并两个上身链表。
import java.util.*;
public class Solution {
public ListNode sortLinkedList (ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode dummy = new ListNode(0);
ListNode evens = new ListNode(0);
ListNode odd = head;
ListNode even = head.next;
dummy.next = odd;
evens.next = even;
while(even != null && even.next != null){
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = null;
ListNode neweven = reverse(evens.next);
return merge(dummy.next,neweven);
}
public ListNode reverse(ListNode head){
ListNode pre = null;
while(head != null){
ListNode tmp = head.next;
head.next = pre;
pre = head;
head = tmp;
}
return pre;
}
public ListNode merge(ListNode odd, ListNode even){
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
while(odd != null && even != null){
if(odd.val < even.val){
cur.next = odd;
odd = odd.next;
cur = cur.next;
}else{
cur.next = even;
even = even.next;
cur = cur.next;
}
}
if(odd != null){
cur.next = odd;
}
if(even != null){
cur.next = even;
}
return dummy.next;
}
}