题目:
链接: https://leetcode.com/problems/insertion-sort-list/
题解:
链表插入排序,考察基本功。worst case时间复杂度是O(n2) , best case时间复杂度是O(n)。 好久没做题最近完全懈怠了,要继续努力啊。
Time Complexity - O(n2) (worst case), Space Complexity - O(n)。
public class Solution { public ListNode insertionSortList(ListNode head) { if(head == null || head.next == null) return head; ListNode dummy = new ListNode(-1); while(head != null){ ListNode node = dummy; while(node.next != null && node.next.val <= head.val) node = node.next; ListNode temp = head.next; head.next = node.next; node.next = head; head = temp; } return dummy.next; } }
Update:
/** * 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 || head.next == null) return head; ListNode dummy = new ListNode(-1); while(head != null) { ListNode node = dummy; while(node.next != null && node.next.val < head.val ) node = node.next; ListNode temp = head.next; head.next = node.next; node.next = head; head = temp; } return dummy.next; } }
二刷:
跟一刷使用的节点交换顺序不太一样。不过大体方法差不多。在head不为空的情况下,先设一个dummy的reference copy - node,从头比较node.next.val 和head.val来找到insert的位置,再倒腾几下就好了。
Java:
Time Complexity - O(n2) (worst case), Space Complexity - O(n)。
/** * 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) { ListNode dummy = new ListNode(-1); while (head != null) { ListNode node = dummy; while (node.next != null && node.next.val < head.val) { node = node.next; } ListNode tmp = node.next; node.next = head; head = head.next; node.next.next = tmp; } return dummy.next; } }
三刷:
Java:
Time Complexity - O(n2) (worst case), Space Complexity - O(1)。
/** * 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) { ListNode dummy = new ListNode(-1); ListNode tmp = null, node = dummy;; while (head != null) { node = dummy; while (node.next != null && node.next.val < head.val) node = node.next; tmp = node.next; node.next = head; head = head.next; node = node.next; node.next = tmp; } return dummy.next; } }