【LeetCode 中等題】69-對連結串列進行插入排序
阿新 • • 發佈:2019-01-14
題目描述:對連結串列進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。
插入排序演算法:
- 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
- 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
- 重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3 輸出: 1->2->3->4示例 2:
輸入: -1->5->3->4->0 輸出: -1->0->3->4->5
解法1。dummy引領的一個已經排好序的子串,類似於插入排序中前半段不斷延伸的已經排好序的子串,head指向的是未排序的後半段子串,前後半段子串即cur引領的和head引領的是斷開的,cur每次從頭往後直到找到一個head插入的節點位置(head應該插入cur.next這個位置)
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def insertionSortList(self, head): """ :type head: ListNode :rtype: ListNode """ if not head: return dummy = ListNode(-1) # 這裡不用急著連線,dummy引領的已經排好序的子串 while head: t = head.next cur = dummy while cur.next and cur.next.val <= head.val: cur = cur.next # 找插入head元素的位置 head.next = cur.next cur.next = head head = t return dummy.next # 上述程式碼可以改良,cur不必每次都從頭往後找位置,如果當前head比cur的值大,那cur可以繼續後移而不必從頭開始 class Solution(object): def insertionSortList(self, head): """ :type head: ListNode :rtype: ListNode """ if not head: return dummy = ListNode(-1) # dummy.next = head cur = dummy while head: t = head.next # 增加了下面這句if語句,根據兩者的值大小來決定是否讓cur從頭再來找到head在已排序子連結串列的插入位置 if cur != dummy and cur.val > head.val: cur = dummy while cur.next and cur.next.val <= head.val: cur = cur.next head.next = cur.next cur.next = head head = t return dummy.next