147. Insertion Sort List

题目:

Sort a linked list using insertion sort.

思路:

  链表的插入排序和数组的插入排序略有不同。以链表4->2->3->1->5为例,为方便操作添加一个头节点-1,此时链表为-1->4->2->3->1->5。基本思路为一次选择前后两个节点,若后节点大于前节点则不断向后循环,若后节点小于前节点则取出后节点,并插入到头节点和前节点之间的位置。

  举例说明:

  • 头节点为-1,cur为节点4,nextnode为节点2。此时,后节点小于前节点,取出节点2,节点3成为新的nextnode。将节点2插入到-1与4之间,此时链表为:-1->2->4->3->1->5。
  • 头节点为-1,cur仍然为节点4,nextnode为节点3。此时,后节点小于前节点,取出节点3,节点1成为新的nextnode。将节点3插入到-1与4之间,此时链表为:-1->2->3->4->1->5。
  • 头节点为-1,cur仍然为节点4,nextnode为节点1。此时,后节点小于前节点,取出节点1,节点5成为新的nextnode。将节点1插入到-1与4之间,此时链表为:-1->1->2->3->4->5。
  • 头节点为-1,cur仍然为节点4,nextnode为节点5。此时,后节点大于前节点,向后循环,nextnode为NULL,排序完成,退出循环。

代码:

 1 class Solution {
 2 public:
 3     ListNode* insertionSortList(ListNode* head) {
 4         if (head == NULL || head->next == NULL)
 5             return head;
 6         ListNode *newhead = new ListNode(-1);
 7         newhead->next = head;
 8         ListNode *cur = head;
 9         ListNode *nextnode = head->next;
10         while (nextnode != NULL) {
11             if (cur->val <= nextnode->val) {
12                 nextnode = nextnode->next;
13                 cur = cur->next;
14             } else {
15                 ListNode *temp = nextnode;
16                 cur->next = nextnode->next;
17                 nextnode = nextnode->next;
18
19                 ListNode *pre = newhead;
20                 ListNode *insert = newhead->next;
21                 while (insert->val <= temp->val) {
22                     pre = insert;
23                     insert = insert->next;
24                 }
25                 pre->next = temp;
26                 temp->next = insert;
27             }
28         }
29         return newhead->next;
30     }
31 };
时间: 2024-10-14 17:37:34

147. Insertion Sort List的相关文章

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

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

147. Insertion Sort List (List)

Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNode *head) { if(!head || !head->next) return head; ListNode *tail =head->next; head->next = NULL; ListNode *current; ListNode *tmp; while(tail){ if

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,那么

[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 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_ta

[leedcode 147] Insertion Sort List

Sort a linked list using insertion sort. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { //插入排序,时间复杂度O(n^2),注意终止条件,默认p之前的已经从小到大排好序了 public Li

【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