147 Insertion Sort List

来源:互联网 发布:国际服务器端口定义 编辑:程序博客网 时间:2024/05/20 19:45

题目链接:https://leetcode.com/problems/insertion-sort-list/

题目:

Sort a linked list using insertion sort.

解题思路:
1、插入排序的通用算法
2、链表的插入排序和数组的插入排序存在差异:

  • 链表:当前要插入的元素,对已排好序的链表从前往后比较
  • 数组:当前要插入的元素,对已排好序的数组从后往前比较(需要往后挪元素,为插入的元素腾坑)

3、由于插入和删除节点需要知道该节点的先驱,又为了减少指针的个数的使用(不单独采用一个指针指向要比较的元素的前驱),比较节点时一律采取比较当前指针所指节点的后继。即:p指向有序链表的最后一个节点。q指向有序链表中的节点。比较时采用 p.next 和 q.next。

注意:
插入情况大致分三种:
1、插入到头结点之前
2、插入到有序链表最后一个节点之前
3、插入到有序链表最后一个节点之后(需将指针p向后移动一个节点)

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public ListNode insertionSortList(ListNode head) {        if(head == null)            return head;        ListNode p = head;        while(p.next != null) {            ListNode temp = p.next;            if(p.next.val < head.val) {                temp = p.next;                p.next = p.next.next;                temp.next = head;                head = temp;            } else {                ListNode q = head;                while(q.next.val <= p.next.val && p.next != q.next)                    q = q.next;                if(q.next != p.next) {                    temp = p.next;                    p.next = p.next.next;                    temp.next = q.next;                    q.next = temp;                }            }            if(temp.val >= p.val)                p = p.next;        }        return head;    }}
0 0
原创粉丝点击