景岁的Leetcode解题报告:147.Insertion Sort List (Java)

来源:互联网 发布:局域网办公软件 编辑:程序博客网 时间:2024/05/01 12:34

这道题要求的是对链表进行插入排序,算是一道简单的考察链表操作的题目。其中的难点在于未排序节点插入已排序节点时的三种不同情况:

1已排序部分头结点就大于要插入值    2已排序部分最后一节点还小于要插入值     3中间情况:要插入值在已排序值中间


下面的程序在插入排序的内层循环中,对上面三种情况进行分别处理:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode insertionSortList(ListNode head) {        if (head==null||head.next==null){       //有了这步,以后只考虑最少两个节点的情况即可            return head;        }                ListNode lh=head;        ListNode rh=head.next;        head.next=null;                ListNode temp1=null;        ListNode temp2=null;                                //外围循环        while(rh!=null){                             lh=head;            //内层循环            while(lh.val<rh.val&&lh!=null&&lh.next!=null){                temp1=lh;                lh=lh.next;            }                        //保存现在rh.next的值,因为一会rh指针会指向别处            temp2=rh.next;                                    //对内层while语句中三种不满足条件的情况分别进行处理:1已排序最后一位还小于要插入值 2头结点就大于要插入值 3要插入值在已排序值中间            if(lh.next==null&&lh.val<rh.val){                lh.next=rh;                rh.next=null;            }            else if(head.val>=rh.val){                head=rh;                head.next=lh;            }            else{                temp1.next=rh;                rh.next=lh;            }                        //将rh置为刚才保存在temp2中的rh.next            rh=temp2;        }                return head;    }}


0 0