leetcode147--对链表进行插入排序

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

解题思路:

1、建立一个头结点指向链表头

2、分别设立两个指针指向第一位和第二位节点

3、如果符合排序顺序则两者均向后移动一位

4、如果不符合,则从头和该节点比较将该节点插入;

实现代码:

扫描二维码关注公众号,回复: 10515334 查看本文章

struct ListNode* insertionSortList(struct ListNode* head){
    if(head == NULL || head->next == NULL) {
        return head;
    }
    struct ListNode* node = (struct ListNode* ) malloc(sizeof(struct ListNode));
    struct ListNode* prev, *cur, *start;
    node->next = head;
    prev = head;
    cur = head->next;
    while(cur) {
        if(prev->val <= cur->val) {
            prev = cur;
            cur = cur->next;
        }
        else {
            start = node;
            while(start->next && start->next->val <= cur->val) 
                start = start->next; 

                prev->next = cur->next;
                cur->next = start->next;
                start->next = cur;
                cur = prev->next;   
        }
    
    }
    head = node->next;
    free(node);
  return head;
}

运行结果:

发布了51 篇原创文章 · 获赞 2 · 访问量 869

猜你喜欢

转载自blog.csdn.net/scacacac/article/details/105334507