我的LeetCode代碼倉:https://github.com/617076674/LeetCode
原題連結:https://leetcode-cn.com/problems/insertion-sort-list/description/
題目描述:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLykEVPhXTq1EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3UzN3IjMwMjM5ATMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
知識點:插入排序、連結清單
思路:用連結清單模拟插入排序的過程
為了避免對頭節點是否為null的讨論,設立虛拟頭節點dummyHead。
用cur指針周遊連結清單中的每一個節點,對每一個cur指針指向的位置,用newCur指針從頭開始周遊連結清單尋找cur指針指向的節點的合适的插入位置。由于需要交換節點的位置,我們需要記錄cur指針的前一個節點指針pre,以及newCur指針的前一個節點指針newPre。
時間複雜度是O(n ^ 2),其中n為連結清單中的節點個數。空間複雜度是O(1)。
JAVA代碼:
public class Solution {
public ListNode insertionSortList(ListNode head) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
ListNode cur = dummyHead.next;
ListNode newPre = dummyHead;
ListNode newCur = dummyHead.next;
while(cur != null) {
while(newCur != cur && newCur.val < cur.val) {
newPre = newPre.next;
newCur = newCur.next;
}
if(newCur != cur) {
ListNode nextCur = cur.next;
newPre.next = cur;
cur.next = newCur;
pre.next = nextCur;
cur = nextCur;
}else {
pre = pre.next;
cur = cur.next;
}
newPre = dummyHead;
newCur = dummyHead.next;
}
return dummyHead.next;
}
}
LeetCode解題報告: