---
Solution: Probably the only way to do this using constant memory is to use merge sort. We use the technique of finding the middle of the linked list using a slow pointer and a fast pointer. So we can break down a linked lists into two parts, and then sort each part and merge them together.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if (head == null) return null;
if (head.next == null) return head;
// Find the middle of the linked list.
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// Break up the linked list into two parts.
ListNode first = head;
ListNode second = slow.next;
slow.next = null;
// Sort each part separately.
first = sortList(first);
second = sortList(second);
// Merge the two linked lists.
ListNode curr = null;
while (first != null || second != null) {
ListNode node;
if (first == null) {
node = second;
second = second.next;
} else if (second == null) {
node = first;
first = first.next;
} else if (first.val < second.val) {
node = first;
first = first.next;
} else {
node = second;
second = second.next;
}
if (curr == null) {
head = curr = node;
} else {
curr.next = node;
curr = node;
}
}
return head;
}
}
No comments:
Post a Comment