---
Solution: For each node in the given linked list, insert it in order into a new linked list. Not easy to get the logic right the first time one writes the code.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode insertionSortList(ListNode head) {
if (head == null) return null;
// Start off a new list reusing the same nodes.
ListNode newHead = head;
head = head.next;
newHead.next = null;
// Insert each node in order.
while (head != null) {
// head.next will be overwritten, so save it first.
ListNode next = head.next;
newHead = insertInOrder(newHead, head);
head = next;
}
return newHead;
}
private ListNode insertInOrder(ListNode head, ListNode curr) {
// Find position at which we should insert curr.
ListNode prev = null;
ListNode node = head;
while (node != null && curr.val > node.val) {
prev = node;
node = node.next;
}
// We might need to insert as the head of the list.
if (prev == null) {
curr.next = head;
return curr;
}
// Insert as per normal inside the list.
curr.next = prev.next;
prev.next = curr;
return head;
}
}
No comments:
Post a Comment