题外话:最近打算做一些LeetCode OJ上面的练习题了,当然很多前辈都已经写过若干解题报告了。坦白说,也正是因为前辈们的贡献,才让我们学习到了很多知识。所以,我一直都在犹豫到底要不要写解题报告多此一举呢?当然,我水平很渣啊。我觉得虽然,有很多很好的解题报告可参考了,但是自己对待这件事的态度又是另外一回事,记录下来,完全是提醒自己这段时间是有计划的,是要做题的。
24题:Swap Nodes in Pairs
题目分析:链表长度为奇数时,最后一个节点不用再调整啦。当然了,不能改变节点的值,否则,你还玩不玩了?
class Solution { public: ListNode *swapPairs(ListNode *head) { if (head == NULL || head->next == NULL) { return head; } ListNode tmpNode(-1); ListNode *pre = &tmpNode, *cur, *next; for (cur = head, next = cur->next; next; pre = cur, cur = cur->next, next = cur ? cur->next : NULL) { pre->next = next; cur->next = next->next; next->next = cur; } return tmpNode.next; } };
148题:Sort List
题目分析:从时间性能上看,貌似不能用快速排序,快速排序的期望性能是nlogn的,所以归并排序应该是比较容易想到的。
class Solution { public: ListNode* MergeList(ListNode *lList, ListNode *rList) { ListNode tmpNode(-1); ListNode *tmp = &tmpNode; while (lList != NULL && rList != NULL) { if (lList->val < rList->val) { tmp->next = lList; lList = lList->next; } else { tmp->next = rList; rList = rList->next; } tmp = tmp->next; } if (lList != NULL) { tmp->next = lList; } if (rList != NULL) { tmp->next = rList; } return tmpNode.next; } ListNode* sortList(ListNode *head) { if (head == NULL || head->next == NULL) { return head; } //利用快慢指针找到中间位置 ListNode *fast = head, *slow = head; while (fast->next != NULL && fast->next->next != NULL) { fast = fast->next->next; slow = slow->next; } //分割为两个链表 fast = slow->next; slow->next = NULL; ListNode *lList = sortList(head); ListNode *rList = sortList(fast); return MergeList(lList, rList); } };
61题:Rotate List
题目分析:我只能说千万不要很实在地移动k个节点,就像上面的例子,k=5,k=10,...这不都是与没移动一个效果么。另外,那个不用一步一移,可以最后找到合适位置断开即可。
class Solution { public: ListNode* rotateRight(ListNode *head, int k) { if (head == NULL || head->next == NULL) { return head; } //计算长度 ListNode *p = head; int lenList = 1; while (p->next != NULL) { p = p->next; lenList += 1; } p->next = head; int step = lenList - k % lenList; for (int i = 0; i < step; ++i) { p = p->next; } //断开 head = p->next; p->next = NULL; return head; } };
时间: 2024-10-08 10:29:02