LeetCode 147. 对链表进行插入排序

思路:这道题目的思路是使用插入排序,但是因为单向链表只能单向遍历,所以当需要插入的时候,使用一个指针从头开始找插入点,而不是从后往前找


/**
 * 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==NULL || head->next==NULL)
            return head;
        
        ListNode *temp1, *temp2, *p=head;
        ListNode *p1=p->next;
        
        while(p1!=NULL){
            if(p1->val >= p->val){
                p1=p1->next;
                p=p->next;
            }           
            else{//需要交换
                temp1=head;
                if(p1->val<temp1->val){//如果需要插入的位置在头指针前
                    p->next=p1->next;
                    p1->next=temp1;
                    head=p1;
                    p1=p->next;
                    continue;
                }
                
                temp2=head->next;
                while(temp2!=p1){
                    if(temp2->val<=p1->val){
                        temp2=temp2->next;
                        temp1=temp1->next;
                    }   
                    else{//插入到temp2之前
                        p->next=p1->next;
                        p1->next=temp2;
                        temp1->next=p1;
                        p1=p->next;
                        break;
                    }
                }
            }
        }
        
        return head;
    }
};

猜你喜欢

转载自blog.csdn.net/sinat_15723179/article/details/80878152