天天看点

(java)leetcode 147.对链表进行插入排序

(java)leetcode 147.对链表进行插入排序

题目解读:

题目给了我们基本的链表的结构:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
           

然后我们依据人家传过来的链表头,通过next,获取链表的下一个结点,就这样,将整个链表的val串起来,再进行排序。

排序的算法为直接插入排序:从第一个元素开始,该链表可以被认为已经部分排序。

每次迭代时,从输入数据中移除一个元素,并原地将其插入到已排好序的链表中。

题目思路:

此题目并没有保持空间复杂度为O1,即在不创建新的ListNode的情况下,进行链表的排序。

题目中,我们可以按照以下思路去解题:

我们使用自己创建的链表,依次存储ListNode排序好的每一个节点,而至于排序的方法,我们遍历是肯定是需要遍历的,遍历每一个元素,插入的时候肯定也是有技巧的,我的思路是这样的:

假如说,我遍历到了元素index ,这个index比我排序好的链表,最右边的val还大,那我就不遍历了,直接插进去,速度也快点,如果这个index不比我排序好的链表最右边的val大,那就进入排序,依次遍历之前排序好的序列,然后找到具体插入的位置。

解题逻辑

说完了思路,然后我讲解题的逻辑,也就是解题的详细流程详细的说一遍:

  1. 我们要首先创建一张空的链表ListNode,以便我们能存放排序好的链表元素。
  2. 针对我们创建的ListNode,要准备两个指针,我们给两个指针取名为pre,用来遍历排序好的链表val,一个叫做lat,指向排序好的链表的尾结点。
  3. 其实我们知道了上面的思路,剩下的就好做的,需要的就是用一个while循环,遍历所有的元素,从头到尾。
  4. 在循环内部,我们如同刚才说的思路一样,加一个判断,如果待排序的val,比排序好的最大的还大,那我们就直接lat.next=head,lat = head , head = head.next
  5. 如果不满足4,那么我们就进入已排序好的数组的循环,通过一个while找到插入的位置就可以了。
(java)leetcode 147.对链表进行插入排序