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
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.youkuaiyun.com/karen0310/article/details/75036066
请尊重作者的劳动成果,转载请注明出处!