一,问题描述
1,使用插入排序方法来对单链表进行排序
2,解题思路:
为了使得插入结点更加方便点,我们在单链表的头结点增加一个新结点(该新结点作为第一个结点)。然后,从第二个结点与下一个结点进行比较,如果下一个结点小于第二个结点的话,则把下一个结点从单链表取下,然后插入到第二个结点之前的已经排序好的结点中取,依次类推。最终使得单链表有序。
二,AC了的程序(Java实现的)
1, 第一种方法
import java.util.*; //leetcode 第一种方法
class ListNode{
int val;
ListNode next;
ListNode(int x)
{
val=x;
}
}
public class Test2{
public ListNode insertionSortList(ListNode head)
{
if(head==null||head.next==null)
{
return head;
}
ListNode root=new ListNode(0); //对单链表头结点再增加一个结点
root.next=head;
ListNode p=head;
ListNode q=head.next;
ListNode temp;
while(q!=null)
{
if(p.val>q.val)
{
ListNode te=q;
q=q.next;
p.next=q;
temp=root;
while(temp.next.val<=te.val) //这里注意的就是temp的下一个结点才和取下来的结点进行比较
{
temp=temp.next;
}
te.next=temp.next;
temp.next=te;
}
else
{
p=q;
q=q.next;
}
}
return root.next;
}
public static void main(String []args)
{
Test2 test=new Test2();
ListNode l1=new ListNode(5);
ListNode l2=new ListNode(2);
ListNode l3=new ListNode(4);
ListNode l4=new ListNode(8);
ListNode l5=new ListNode(1);
l1.next=l2;
l2.next=l3;
l3.next=l4;
l4.next=l5;
ListNode node=test.insertionSortList(l1);
while(node!=null)
{
System.out.print(node.val+" ");
node=node.next;
}
System.out.println();
}
}
2,第二种方法
import java.util.*; //leetcode 147 第二种方法
class ListNode{
int val;
ListNode next;
ListNode(int x)
{
val=x;
}
}
public class Test2{
public ListNode insertionSortList(ListNode head)
{
if(head==null)
{
return head;
}
if(head.next==null)
{
return head;
}
ListNode root=new ListNode(0); //单链表最初增加一个节点,是为了防止在链表头部加新节点的。
root.next=head;
ListNode p=head;
ListNode q;
ListNode temp2;
while(p!=null&&p.next!=null)
{
if(p.val<=p.next.val)//如果前一个数小于等于后一个数
{
p=p.next;
}
else
{
q=p.next; //把那个比前一个数小的那个节点取出来。
p.next=q.next;
temp2=root; //每次均要从头开始
while(temp2.next.val<=q.val)
{
temp2=temp2.next;
}
q.next=temp2.next;
temp2.next=q;
}
}
return root.next;
}
public static void main(String []args)
{
Test2 test=new Test2();
ListNode l1=new ListNode(5);
ListNode l2=new ListNode(2);
ListNode l3=new ListNode(4);
ListNode l4=new ListNode(8);
ListNode l5=new ListNode(1);
/*
ListNode l1=new ListNode(2);
ListNode l2=new ListNode(1);
ListNode l3=new ListNode(3);
ListNode l4=new ListNode(4);
ListNode l5=new ListNode(5);
*/
l1.next=l2;
l2.next=l3;
l3.next=l4;
l4.next=l5;
ListNode node=test.insertionSortList(l1);
while(node!=null)
{
System.out.print(node.val+" ");
node=node.next;
}
System.out.println();
}
}
运行结果:
1 2 4 5 8