Insertion Sort List
Sort a linked list using insertion sort.
原題鏈接爲: https://leetcode.com/problems/insertion-sort-list
分析:
使用插入排序對鏈表進行排序。
可以新建一個帶頭節點的有序鏈表,每次從原鏈表中選擇一個節點,插入到帶頭節點的鏈表中。
C++代碼:
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
ListNode dummy = ListNode(-1);
ListNode * cur = head, *p, *pnext, *t;
while(cur){
p = &dummy;
while(p->next && cur->val > p->next->val){
p = p->next;
}
pnext = p->next;
p->next = cur;
t = cur->next;
cur->next = pnext;
cur = t;
}
return dummy.next;
}
};
Python的代碼不知道爲什麼一直TLE。
先貼上,等回頭再過來改。
20190227: 試了下代碼AC了,並簡單修改了下代碼:
class Solution(object):
def insertionSortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
cur = head
# dummy是新的鏈表表頭
dummy = ListNode(-1)
while cur:
p = dummy
while p.next and cur.val > p.next.val:
p = p.next
t = cur.next
cur.next = p.next
p.next = cur
cur = t
return dummy.next
時間優化:上述代碼運行速度較慢,打敗了30多的submission,想到了一個優化方案,用指針記錄新鏈表的head、end和上一次插入的節點lastinsert三個節點,對於新的節點,先和這三個節點作比較,再插入節點。此時平均可以減少一半的比較次數。