List类题型:Sort LinkedList using Insertion Sort

排序是CS的一个基本功,不过大部分训练都是在Array的排序上。相比起Array排序,List的排序会难上不少。

第一次做的一些思路: 肯定首先是要iterate throug 整个List。 然后根据insertion sort的idea,每一次到一个新的node,就要跟前面的已经sort好的部分做比较,插入到第一个比node小的地方。但是想到这里就会发现一些问题, 比如说由于List Node没有前指针,所以是不可能从Node往前面sorted section iterate的。所以基本上可以知道每次到一个新的node, 都得从List的头重新往后iterate,找到一个合适的地方插进去。然后还有一个问题就是当发现了合适的地方要插进去的时候,Node的next索引应该为Node.prev 来指过去。还有!万一原List的第一个Node其实应该丢到最后一个位置,那整个list的头都得变, 这边马上会想到我们需要一个Fake head points to list head.

一系列的问题在面试的时候突然要迅速解决,我觉得还是难度值还是挺高的。。。

5min later..

我自己的solution也算是work,基本就是上述的写法,不过run time实在是太慢了。

看了一下Leetcode discussion的解法:

总结了一下。 1:  Iterate list的时候,大神做了一个判断。 如果当前node比下一个小的时候,啥也不做,iterate到下一个node。【逻辑上很正常, 因为 1-2-3 比下一个小就不用排序了】  如果当前node比下一个大,那就说明这个node需要处理一下了。 怎么处理?

while (first.next.val < curr.next.val) : first = first.next;  从List 的头开始,iterate一直到出现一个node such that它的下一个的node的值是小于curNode的下一个node的值。也就是说从sorted section找到第一个能插入的地方。改变一下索引,first.next = cur.next. [重要的一点是,最后first 要point back to fake 这样下一次才能继续用]

假设3->1-->4 cur从3 开始, 变成1->3->4 cur现在在3. 我们会注意到每次当他iterate到新的node的时候,cur 指向的是sorted section的最后一个node。在cur之前的全部是sorted好的,这样他只要把cur.next往之前所有里找一个空插入就好了。相比之前我的做法就显得异常的麻烦,还要设立一个单独的node做为sorted section的最后一个node。

你可能感兴趣的:(List类题型:Sort LinkedList using Insertion Sort)