Leetcode 147 Insertion Sort List(插入排序列表)

26 篇文章 0 订阅
14 篇文章 0 订阅

一,问题描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值