题目描述
Sort a linked list using insertion sort.
Solution 1
/*
下面是效仿数组的插入排序的一种方法。
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(head==nullptr||head->next==nullptr)
return head;
ListNode *p,*q;
p=head->next;
while(p!=nullptr)//从第二个元素开始插入
{
q=p->next;
p->next=nullptr;//将插入元素后指针置nullptr
InsertList(head,p,q);
p=q;
}
return head;
}
private:
void InsertList(ListNode *&front,ListNode *obj,ListNode *_next)
{
ListNode *NewNode=new ListNode(obj->val);
ListNode *q,*p;
p=front;
q=front->next;
while(!(q->val==obj->val&&q->next==nullptr))//将待插指针从链表尾中删除
{
p=p->next;
q=q->next;
}
p->next=nullptr;
q=front;
if(q->val>obj->val)//当链表第一个元素大于待插元素时
{
NewNode->next=front;
front=NewNode;
while(q->next!=nullptr)
q=q->next;
q->next=_next;//将差值完成的链表与后链表接起来
}
else{
ListNode *temp;
while(q!=nullptr)
{
if(q->val<obj->val)//寻找插入位置
{
temp=q;
q=q->next;
}
else break;
}
if(q!=nullptr)//插入位置在链表中间某个位置
{
temp->next=NewNode;
NewNode->next=q;
while(q->next!=nullptr)
q=q->next;
q->next=_next;
}
else{ //插入位置在链表尾部
temp->next=NewNode;
NewNode->next=_next;
}
}
return ;
}
};
Solution 2
/**
* 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==nullptr||head->next==nullptr)
return head;
ListNode *NewList=new ListNode(0);
ListNode *q,*p,*pre;
while(head!=nullptr)
{
pre=NewList;
q=pre->next;
p=head;
head=head->next;
while(q!=nullptr&&q->val<p->val)
{
pre=pre->next;
q=q->next;
}
pre->next=p;
p->next=q;
}
return NewList->next;
}
};