147 对链表进行插入排序

来源:5-5 不仅仅是穿针引线 Delete Node in a Linked List

邹正霖

2020-11-24

老师, 我按自己思路写了这段,结果不对。
我手动模拟了一下,觉得逻辑是对的,不知道问题出在哪,能帮我看看是哪里出问题了嘛?
谢谢老师!

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
		if(!head || !head->next)
			return head;

		ListNode* virHead = new ListNode(-1);
		virHead->next = head;
		
		ListNode* cur = head->next;  // 当前需要比较的数
		ListNode* pre = head;		 // [virHead, pre]拍好序
		while(cur){
			if(cur->val < pre->val){
				ListNode* tmp = cur;	// 删除
				pre->next = cur->next;
				cur = cur->next;

				ListNode* begin = virHead;		// 插入排序:找>=的前一个位置
				for(; begin->next != pre; begin->next){
					if(begin->next->val >= tmp->val){
						tmp->next = begin->next;	// 插入
						begin->next = tmp;
					}
				}					
			}
			else{
				pre = cur;
				cur = cur->next;
			}
		}

		ListNode* retNode = virHead->next;
		delete virHead;

		return retNode;
    }
};
写回答

1回答

liuyubobobo

2020-11-24

你的代码对 2->1 这样一个只包含两个节点的链表的结果都是错误的。这个课程告诉了同学们如何创建一个链表的用例去实际运行自己的程序。创建这样一个只包含两个节点的链表,用单步跟踪弄的方式去具体调试。进步就在这个过程中哦。


如果还有问题,请具体说明,对于什么测试用例,在算法的哪一步,你认为某个变量存储的结果应该是什么?可是实际是什么?你不理解为什么


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


加油!:)

0
0

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

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

7408 学习 · 1150 问题

查看课程