1. 程式人生 > >【LeetCode 中等題】69-對連結串列進行插入排序

【LeetCode 中等題】69-對連結串列進行插入排序

題目描述:對連結串列進行插入排序。


插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

插入排序演算法:

  1. 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
  2. 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  3. 重複直到所有輸入資料插入完為止。

示例 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

參考連結:http://www.cnblogs.com/grandyang/p/4250107.html