看到一道题目,还挺有意思
一个链表奇数位上升序,偶数位上降序,不用额外空间让这个链表整体升序,例如:1 8 3 6 5 4 7 2 9,最后输出1 2 3 4 5 6 7 8 9。
其实不算很难,就是题目比较新颖
解:首先分离出奇数链表和偶数链表,偶数链表反转一下,就成为升序了,最后把两条升序链表合并即可(leetcode上这种题也挺经典的)
public class SortList {
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override public String toString() {
return "ListNode{" + "val=" + val + ", next=" + next + '}';
}
}
@Test
public void test() {
//测试 1-8-3-6-5-4-7-2-9
ListNode l9 = new ListNode(9);
ListNode l2 = new ListNode(2, l9);
ListNode l7 = new ListNode(7, l2);
ListNode l4 = new ListNode(4, l7);
ListNode l5 = new ListNode(5, l4);
ListNode l6 = new ListNode(6, l5);
ListNode l3 = new ListNode(3, l6);
ListNode l8 = new ListNode(8, l3);
ListNode head = new ListNode(1, l8);
ListNode ans = sort(head);
System.out.println(ans);
}
public ListNode sort(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode head1 = head, head2 = head.next, pre = head1, cur = head2;
//将奇数偶数链表拆分出来
while (cur != null && cur.next != null) {
ListNode next = cur.next;
cur.next = next.next;
pre.next = next;
pre = pre.next;
cur = cur.next;
}
head2 = reverse(head2);
return merge(head1, head2).next;
}
//反转链表
private ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode root = reverse(head.next);
head.next.next = head;
head.next = null;
return root;
}
//合并两条链表,升序
private ListNode merge(ListNode head1, ListNode head2) {
ListNode dummy = new ListNode(0), tmp = dummy;
while (head1 != null && head2 != null) {
if (head1.val < head2.val) {
tmp.next = head1;
head1 = head1.next;
} else {
tmp.next = head2;
head2 = head2.next;
}
tmp = tmp.next;
}
if (head1 != null) {
tmp.next = head1;
}
if (head2 != null) {
tmp.next = head2;
}
return dummy;
}
}