147. 对链表进行插入排序嗯嗯对的

对链表插入排序,可以用两个指针p, q进行往后取结点操作;
开始如果head为空,直接返回NULL即可;
否则,让p指向head,q始终为p的下一个指针,这样每次对p操作后还能更新p为操作前的下一个指针,即q,同时也更新q为q->next。
开始让head为空,这样可以巧妙的不额外添加的哑巴节点,于是我们把第一个要插入的结点的操作与插入到链表首端的操作归到一起:

> p->next = head;(这就是head开始设为NULL的原因)
> head = p; ```

如果不是插到链表首端,那么一定插入在head的后面,这时让t指向head,每次判断t->next的值与取出的结点p的值比较,直到p->val < t->next->val,那么p->val 必然满足p->val > t->val,所以使p插在t和t->next之间,同时一种特殊情况,如果p->val大于所有结点的值,那么p应该插入到最后面,此时t已经指向最后一个结点,我们判断如果最后t指向最后一个结点即t->next == NULL时,进行插入操作,我们可以这样想,插入到t与NULL之间,把NULL当作一个结点值无穷大的结点,把插入到最后的特殊情况与普通插入归类在一起

    if (t->next == NULL || p->val < t->next->val) {
        p->next = t->next;
        t->next = p;
        break;
    }
    t = t->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) {
        if(!head)
            return NULL;
        ListNode *p = head,*q = head->next;
        head = NULL;
        while(p){
            if(!head || p->val < head->val){
                p->next = head;
                head = p;
            }
            else{
                ListNode* t = head;
                while(t){
                    if(t->next == NULL || p->val < t->next->val){
                        p->next = t->next;
                        t->next = p;
                        break;
                    }
                    t = t->next;
                }
            }
            p = q;
            if(q)
            q = q->next;
        }
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值