1. 程式人生 > >LeetCode 147. 對連結串列進行插入排序(C++)

LeetCode 147. 對連結串列進行插入排序(C++)

題目:

對連結串列進行插入排序。
動畫演示
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

插入排序演算法:
1.插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
2.每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
3.重複直到所有輸入資料插入完為止。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4

重點內容

示例 2:

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

思路:

實際上插入排序我們就是對於連結串列的每一需要排序的節點cur,只需要遍歷該節點之前是否有及節點nodeval小於大於需要排序的節點的val,如果沒有,node節點後移,如果有則只需要將cur放在node之前就可以了,這裡需要注意的是由於是放置在node之前,所有我們實際訪問的node的時候最好使用它的前一個節點->next的方式訪問它。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution { public: ListNode* insertionSortList(ListNode* head) { ListNode* dummyHead = new ListNode(0); ListNode* pre = dummyHead;; //插入位置的前一個節點 ListNode* cur = head;; //待排序的節點 ListNode* rear; //待排序節點的下一個節點 while(cur != NULL){ rear = cur->next; while
(pre->next != NULL && pre->next->val < cur->val){ pre = pre->next; } cur->next = pre->next; pre->next = cur; cur = rear; pre = dummyHead; } return dummyHead->next; } };