LeetCode刷题笔记(链表):reorder-list

桃扇骨 2022-06-01 00:38 293阅读 0赞

  • 转载请注明作者和出处:http://blog.csdn.net/u011475210
  • 代码地址:https://github.com/WordZzzz/Note/tree/master/LeetCode
  • 刷题平台:https://www.nowcoder.com/ta/leetcode
  • 题  库:Leetcode经典编程题
  • 编  者:WordZzzz

    • 题目描述
    • 解题思路
    • C版代码实现

题目描述

Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…

You must do this in-place without altering the nodes’ values.

For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.

解题思路

要求in-place,所以不能使用辅助空间。可以采用快慢指针先找到中间点,将原列表分成两个部分,然后再将后半部分反转链表,最后再根据题目规则一前一后合并成一个链表。

C++版代码实现

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *getMiddle(ListNode *head){
  12. ListNode *fast = head;
  13. ListNode *slow = head;
  14. while(fast->next != NULL && fast->next->next != NULL){
  15. slow = slow->next;
  16. fast = fast->next->next;
  17. }
  18. return slow;
  19. }
  20. ListNode *reverseList(ListNode *head){
  21. ListNode *pReversedHead = NULL;
  22. ListNode *pNode = head;
  23. ListNode *pPrev = NULL;
  24. while(pNode != NULL){
  25. ListNode *pNext = pNode->next;
  26. if(pNext == NULL)
  27. pReversedHead = pNode;
  28. pNode->next = pPrev;
  29. pPrev = pNode;
  30. pNode = pNext;
  31. }
  32. return pReversedHead;
  33. }
  34. void mergeList(ListNode *left, ListNode *right){
  35. while(left != NULL && right != NULL){
  36. ListNode *curLeft = left->next;
  37. ListNode *curRight = right->next;
  38. left->next = right;
  39. right->next = curLeft;
  40. left = curLeft;
  41. right = curRight;
  42. }
  43. }
  44. void reorderList(ListNode *head) {
  45. if(head == NULL || head->next == NULL)
  46. return ;
  47. ListNode *middle = getMiddle(head);
  48. ListNode *right = reverseList(middle->next);
  49. middle->next = NULL;
  50. ListNode *left = head;
  51. mergeList(left, right);
  52. }
  53. };

系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~

完的汪(∪。∪)。。。zzz

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读