[LeetCode]147. Insertion Sort List 深入浅出讲解和代码示例

1、汇总概要

本题涉及的知识点是链表。

2、题目

Sort a linked list using insertion sort.

3、审题

给一链表,用插入法排序

4、解题思路

在链表插入排序时,将链表分割成两段[ [有序][无序]],初始时有序序列=head,无序序列=[head.next,... end]
迭代中,每次从无序中选取第一个插入到有序序列中,因链表是单向指针链接,所以有序和无序序列的分界处Node节点需动态标记保存。

举例如下
Step1: 给定一个链表,如10->8->5->9->6->20->2;
Step2: 有序=[10],无序=[8->5->9->6->20->2],需保存的节点有(作为Index)有序的head和tail节点,无序的head节点(即每次待插入的节点);
Step3: 拿无序中第一个元素8往有序序列中插入;=> 有序=[8,10],无序=[5->9->6->20->2],并动态更新Step2中提到的两端序列的边界节点;
Step4: 循环3,当无序序列为空时,结束循环。
循环步骤如下:

[10],[8,5,9,6,20,2]

[8,10],[5,9,6,20,2]

[5,8,10],[9,6,20,2]

[5,8,9,10],[6,20,2]

[5,6,8,9,10],[20,2]

[5,6,8,9,10,20],[2]

[2,5,6,8,9,10,20][]

5、代码示例 - python

import time
class ListNode():
    def __init__(self,val):
        self.val = val
        self.next= None

class Solution(object):
    def insertionSortList(self, head):
        i = head.next
        end = head
        end.next = None
        ipost = None
        #i = the item need to insert
        while( i!=None ):
            if(i.next!=None):
                ipost = i.next
            else:
                ipost = None
            # p = [head,...]
            p = head
            ppre = head
            while (p!=None):
                if (p.val > i.val):
                    if(p == head):
                        head = i;
                        head.next = p
                        break
                    else:
                        ppre.next = i
                        i.next = p
                        break
                else:
                    if(p==end):
                        p.next = i
                        i.next = None
                        break
                ppre = p
                p = p.next
            i = ipost;
        return head

if __name__ == "__main__":
    #build link
    n1 = ListNode(10);
    n2 = ListNode(8);
    n3 = ListNode(5);
    n4 = ListNode(9);
    n5 = ListNode(6);
    n6 = ListNode(20);
    n7 = ListNode(2);
    n1.next = n2;
    n2.next = n3
    n3.next = n4
    n4.next = n5
    n5.next = n6
    n6.next = n7
    
    sol = Solution()
    head = sol.insertionSortList(n1)
    i = head
    while(i!=None):
        print i.val
        i = i.next


---------------------------------------------------------------------------------------------------
本文链接:http://blog.csdn.net/karen0310/article/details/75036066
请尊重作者的劳动成果,转载请注明出处!
---------------------------------------------------------------------------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值