您的位置:首页 > 其它

leetCode解题报告之Insertion Sort List

2014-03-14 00:36 483 查看
题目:

Sort a linked list using insertion sort.

分析:

这个题目是想要让我们来做一个链表的插入排序问题.

这样,我们只要从第一个元素一直往后,直到所有的节点都在前面的序列中找到自己所在的位置即可

情况:

1. 当前值比head的值还小,这情况要插入到head节点之前

2. 当前值比head的值大,这情况要插入到相应的位置

3. 当前值大于所有该节点之前的值,那么当cmpNode(用来作比较的结点)和自身相等的时候,只要将当前结点(nowNode)往后挪一个结点进行下一个结点的比较即可.

解题思路:

大家都知道,如果要在一个位置插入一个结点,那么要知道它的前一个位置的结点才可以,所以为了满足“情况1”,我们引入一个结点preHead(head的前一个结点),它的next域指向head。

接着引入一个 nowNode(当前结点) 和 一个 preNowNode(当前结点的前驱结点)【处于nowNode之前的那些结点是已经排好序了】

最后在引入一个cmpNode(做比较的结点) 和一个preCmpNode(正在做比较的结点的前驱结点) 【从head 直到 nowNode ,依次取出来 和 nowNode做比较,确定nowNode要插入的位置】

有了上面的这些介绍,剩下的看代码,应该就容易多了!!

附个过程图解:



 

package cn.xym.leetcode;

class ListNode {
public int val;
public ListNode next;

ListNode(int x) {
val = x;
next = null;
}
}

public class Solution {

public static void main(String[] args) {
ListNode head = new ListNode(10);
ListNode head1 = new ListNode(3);
ListNode head2 = new ListNode(8);
ListNode head3 = new ListNode(22);
ListNode head4 = new ListNode(15);
ListNode head5 = new ListNode(50);

head.next = head1;
head1.next = head2;
head2.next = head3;
head3.next = head4;
head4.next = head5;
head5.next = null;

head = insertionSortList(head);
while (head != null){
System.out.println(head.val);
head = head.next;
}
}

public static ListNode insertionSortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}

ListNode preHead = new ListNode(Integer.MIN_VALUE);
preHead.next = head;

ListNode nowNode = head.next, preNowNode = head;
while (nowNode != null){
ListNode cmpNode = head;
ListNode precmpNode = preHead;
while (cmpNode != null && !cmpNode.equals(nowNode)){
if (cmpNode.val > nowNode.val){
if (cmpNode.equals(head)){
preNowNode.next = nowNode.next;
nowNode.next = preHead.next;
preHead.next = nowNode;
head = nowNode;
nowNode = preNowNode.next;
}else{
preNowNode.next = nowNode.next;
nowNode.next = precmpNode.next;
precmpNode.next = nowNode;
nowNode = preNowNode.next;
}
break;
}else{
precmpNode = cmpNode;
cmpNode = cmpNode.next;
}
}
if (cmpNode.equals(nowNode)){
preNowNode = nowNode;
nowNode = preNowNode.next;
}
}
return preHead.next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息