问题分析:你的代码实现了链表的冒泡排序,但存在一些问题。
1. 冗余的节点遍历:在外层循环中,你使用了两个指针p1和p2分别表示当前比较的两个节点,但是每次内层循环完毕后,你又将p1和p2重新赋值为head和p1->next,导致每次内层循环开始时都要重新遍历链表,造成了不必要的时间复杂度。
2. 遍历次数错误:外层循环应该进行 length-1 次,而你却进行了 length 次,这会导致冗余的一次循环。
3. 内层循环终止条件错误:内层循环应该从 0 遍历到 length-i-1,而你却遍历到了 length-1,这也造成了冗余的一次循环。
4. 只对节点的值进行了交换:在排序时,你只交换了节点的值,而没有交换节点本身的位置,这样无法正确地改变链表的顺序。
改进方案:基于冒泡排序的思路,我们可以修改你的代码以解决上述问题。具体改进方案如下:struct ListNode* sortList(struct ListNode* head) { if (head == NULL || head->next == NULL) return head; int length = 0; struct ListNode* p = head; while (p != NULL) { length++; p = p->next; } for (int i = 0; i < length - 1; i++) { struct ListNode* p1 = head; struct ListNode* p2 = head->next; struct ListNode* prev = NULL; for (int j = 0; j < length - i - 1; j++) { if (p1->val > p2->val) { if (prev != NULL) prev->next = p2; else head = p2; p1->next = p2->next; p2->next = p1; struct ListNode* temp = p1; p1 = p2; p2 = temp; } prev = p1; p1 = p1->next; p2 = p2->next; } } return head;}
经过以上改进,你的代码现在应该能够正确地对链表进行升序排序了。记得测试一下,确认改动后的代码能否得到预期的结果。
球一个最佳答案谢谢啦!这对我非常重要! |