单链表插入排序超时的问题

来源:5-4 复杂的穿针引线 Swap Nodes in Pairs

青云_KULA

2019-02-13

下面的代码是单链表插入排序的我的手写代码。
具体思路是:
第一个循环,控制每次需要插入的值的前一个节点,然后从链表头遍历找到第一个比这个这个需要插入的值大的前一个节点,然后把这个节点插入到这个节点的前面。

PS:测试后发现排序没有问题,但是会超时。
当数据量为2000的时候就需要5秒多了,这明显不是o(n~2)的算法应该有的速度啊!
提交给LeetCode发现最后一个数据超时
那个数据是从5000-1倒着来的一组数据,检查半天也没有发现什么问题,排序结果没有检查出来什么问题,但这个超时究竟是什么地方引起的那?
还有这个超时应该怎么解决那?
请波波老师帮忙看看,谢谢老师!

ListNode* insertionSortList(ListNode* head)
	{
		if (head == NULL || head->next == NULL)
			return head;
		ListNode * dummyHead = new ListNode(-1);
		dummyHead->next = head;
		ListNode * pi = NULL, *pj = NULL;
		for (pi = dummyHead->next; pi->next != NULL;)
		{
			int val = pi->next->val;
			ListNode * next = pi->next;
			for (pj = dummyHead; pj != pi; pj = pj->next)
			{
				if (pj->next->val > val)
				{
					ListNode * swpNode = pi->next;
					pi->next = swpNode->next;
					swpNode->next = pj->next;
					pj->next = swpNode;
					break;
				}
			}
			pi = next;
		}
		ListNode * res = dummyHead->next;
		delete dummyHead;
		return res;
	}
写回答

1回答

liuyubobobo

2019-02-14

非常隐秘的问题:)


注意,在你的算法中,swapNode和next其实是一样的,都是pi->next。所以一旦swapNode挪到了前面,在外层循环,让pi = next,等同于让pi=swapNode。所以,pi没有一直往前走,一旦发生交换,pi就回到了swapNode的位置。只有swapNode不动的时候,pi才会往前走。


在链表完全倒序的情况下,每次swapNode都交换到链表头,相应的,每次pi也都回去重新扫一遍,变成了一个O(n^3)的算法:)


自己调试跟踪一下试试看?尤其是打印输出一下你的pi,看看是不是会回去?:)


我的参考代码:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0147-Insertion-Sort-List/cpp-0147/main.cpp


继续加油!:)

0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程