题目要求的是对链表进行插入排序,与数组的插入排序思想类似,不过此题是针对链表,在元素的移动以及比较时需要进行额外的处理。
主要思想如下,
从第二的链表元素开始遍历插入,设当前节点为cur,将当前节点的值与当前链表之前的所有节点值进行比较(从头节点开始),出现的第一个节点的值大于cur节点的值,将cur节点插入该节点之前,若cur的值比之前的所有节点值均大,则将cur的值添加到最后。
首先程序是(存在问题)
ListNode * insertionSortList(ListNode *head)
{
ListNode *s, *q, *r, *p;
if(head == NULL||head ->next == NULL||head
->next ->next == NULL)
return head;
r = head ->next;
q = head ->next ->next;
r->next = NULL;
s = head;
while(q!=NULL)
{
p=q;
q = q->next;
while((r->val <= p->val)&& r!=NULL) //问题所在
{
s = r;
r = r->next;
}
p->next = s->next;
s->next = p;
r = head ->next;
}
return head;
}
提交提示测试样例{3,2,4}出现错误,debug发现while((r->val <= p->val)&& r!=NULL)应改为while(r!=NULL&&(r->val <= p->val))因为程序是从左向右执行,错误的写法当 r 为NULL时就不存在 r->val。
更改后提交提示 Timeout。考虑到程序本身逻辑并没有问题,后来发现问题出在头节点上,leetcode中的头节点并不是单纯的头节点,其也包含关键值,因此,在程序中需要新建一个不含关键值的头节点
正确代码
ListNode * insertionSortList(ListNode *head)
{
ListNode *s, *q, *r, *p;
if(head == NULL||head ->next == NULL)
return head;
ListNode * headNode = new ListNode(0);
headNode ->next = head;
r = headNode ->next;
q = headNode ->next ->next;
r->next = NULL;
s = headNode;
while(q!=NULL)
{
p=q;
q = q->next;
while(r!=NULL&&(r->val <= p->val))
{
s = r;
r = r->next;
}
p->next = s->next;
s->next = p;
r = headNode ->next;
}
return head;
}
第二次代码
Accepted
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(head==NULL||head->next==NULL)
return head;
ListNode *newHead = new ListNode(0);
newHead->next = head;
ListNode *p, *q, *pre;
p = head->next;
head->next = NULL;
pre = newHead;
while(p!=NULL)
{
ListNode *tmp = newHead->next;
ListNode *pre = newHead;
q = p->next;
while(tmp!=NULL)
{
if(tmp->val<p->val)
{
pre = tmp;
tmp = tmp->next;
}
else
{
ListNode *t = pre->next;
pre->next = p;
p->next = t;
break;
}
}
if(tmp==NULL)
{
ListNode *t = pre->next;
pre->next = p;
p->next = t;
}
p = q;
}
return newHead->next;
}
};
本文介绍了一种链表插入排序算法的实现过程,并通过修正代码中的错误来提高算法效率。文章详细解释了如何处理链表元素的移动与比较,并提供了一个正确的代码示例。
307

被折叠的 条评论
为什么被折叠?



