LeetCode OJ 147. Insertion Sort List

Sort a linked list using insertion sort.

Subscribe to see which companies asked this question

解答

对于链表的插入排序,用tmp_tail遍历链表,每次的待插入数是tmp_tail->next的元素,待插入数必须从头开始比较,当然从头开始比较时要注意处理待排序数小于或等于链表首元素的情况,因为插入在链表的首元素之前与一般情况的插入不同,而如果待插入数插入在它之前的数列中,则用于遍历链表的指针tmp_tail不需要移动,这与数组不同,毕竟数组插入时是要将部分数组元素整体移动的,而链表不需要,将待插入数插入在前面的链表中后tmp_tail的下一个数就是待排序数,但是如果待插入数保持原位不动,则需要将tmp_tail后移一个,因为新的待插入数是原先待插入数的下一个数,判断待插入数是否在原位只需要在遍历结束后判断tmp_tail->next是否等于tmp_node(待插入数)即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* insertionSortList(struct ListNode* head) {
    struct ListNode *tmp_node, *tmp_head, *tmp_tail = head;

    if(NULL == tmp_tail){
        return head;
    }
    while(NULL != tmp_tail->next){
        tmp_node = tmp_tail->next;
        if(head->val >= tmp_node->val){
            tmp_tail->next = tmp_node->next;
            tmp_node->next = head;
            head = tmp_node;
        }
        else{
            tmp_head = head;
            while(tmp_node != tmp_head->next){
                if(tmp_head->next->val < tmp_node->val){
                    tmp_head = tmp_head->next;
                }
                else{
                    tmp_tail->next = tmp_node->next;
                    tmp_node->next = tmp_head->next;
                    tmp_head->next = tmp_node;
                    break;
                }
            }
            if(tmp_tail->next == tmp_node){
                tmp_tail = tmp_tail->next;
            }
        }
    }

    return head;
}
时间: 2024-10-04 11:36:18

LeetCode OJ 147. Insertion Sort List的相关文章

【Leetcode】147. Insertion Sort List

Question: Sort a linked list using insertion sort. Tips: 使用插入排序,对一个链表进行排序. 思路: 新建一个头结点newHead,设置一个pre指针,指向newHead. cur指针,指向原来的头结点head. 当pre.next的值大于cur的值,就将cur插入到pre之后,否则pre指针后移. 插入一个值之后再将pre指向newHead. 代码: public ListNode insertionSortList(ListNode h

[LeedCode OJ]#147 Insertion Sort List

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:https://leetcode.com/problems/insertion-sort-list/ 题意: 给定一个链表,要求使用插入排序返回一个排好序的链表 思路: 建立新的链表,按照插入排序的特点,每次循环新链表找到新结点将要插入的位置 /** * Definition for singly-linked list. * struct ListNode { * int val

Leetcode 147. Insertion Sort List 插入排序 in Java

147. Insertion Sort List Total Accepted: 80869 Total Submissions: 263074 Difficulty: Medium Sort a linked list using insertion sort. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { va

LeetCode OJ平台上Sort Colors题目算法探讨

原题如下,意思就是说无序数组(由0,1,2组成),一遍扫描,把数组整理成若干个0-若干个1-若干个2这样的序列. Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integ

leetcode 147. Insertion Sort List (Python版)

题目: Sort a linked list using insertion sort. 大意是要实现一个链表的插入排序 算法思路:     从原链表中逐个弹出一个node 对于每一个node用插入排序的思想插入新的升序排列的链表中 这里有一个小trick,leetcode有一组数据是1~4999的升序序列,如果我们采用如上方法会超时 于是我们在插入排序的时候设置一个last位,记录当前插入的位置 在下一次插入的时候与上次插入位置last比较,如果当前node.val > last.val,那么

Java for LeetCode 147 Insertion Sort List

Sort a linked list using insertion sort. 解题思路: 插入排序,JAVA实现如下: public ListNode insertionSortList(ListNode head) { if(head==null||head.next==null) return head; ListNode root=new ListNode(Integer.MIN_VALUE); root.next=head; head=head.next; root.next.nex

[leetcode sort]147. Insertion Sort List

Sort a linked list using insertion sort. 利用插入排序对一个链表进行排序 思路和数组中的插入排序一样,不过每次都要从链表头部找一个合适的位置,而不是像数组一样可以从要插入的位置开始从后往前找合适的位置 1 class Solution(object): 2 def insertionSortList(self, head): 3 dummy = ListNode(-1) 4 dummy.next,cur= head,head 5 while cur and

[LeetCode] 147. Insertion Sort List 解题思路

Sort a linked list using insertion sort. 问题:实现单向链表的插入排序. 这是比较常规的一个算法题目. 从左往右扫列表,每次将指针的下一个元素插入前面已排好序的对应位置中. 需要注意的一定是,列表只能定位下一个元素,不能定位前一个元素,所有,每次插入位置的适合,都是对左右指针的下一个元素进行操作. 1 void insertSort(ListNode* p1, ListNode* p2){ 2 ListNode* next2 = p2->next; 3 p

LeetCode解题报告:Insertion Sort List

Insertion Sort List Sort a linked list using insertion sort. leetcode subject思路:标准的插入排序.考察一下链表的操作. 对链表进行插入排序的正确方法是:新建一个头节点,遍历原来的链表,对原链表的每个节点找到新链表中适合插入位置的前指针,然后执行插入操作.这种操作链表的题的技巧是:新建一个dummy作为head node,然后把数据插入到dummy的链表中,最后返回dummy.next. 链表的插入排序图示: 注意头结点