题目链接:https://leetcode-cn.com/problems/reorder-list/
题解:
方法一:利用vector存放链表,使用双指针进行重排
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 void reorderList(ListNode* head) { 14 if (head == nullptr) { 15 return; 16 } 17 vector <ListNode*> res; 18 ListNode * node = head; 19 while (node != nullptr) { 20 res.push_back(node); 21 node = node->next; 22 } 23 int i = 0, j = res.size() - 1; 24 while (i < j) { 25 res[i]->next = res[j]; 26 i++; 27 if (i == j) 28 break; 29 res[j]->next = res[i]; 30 j--; 31 } 32 res[i]->next = nullptr; 33 } 34 };
方法二:使用双向队列(还没学,待补)
方法三:将链表从中间分为俩部分,然后将后半部分逆转,最后将俩部分进行合并
/** 查找中间指针的方法,使用俩个指针,快指针每次移动俩个位置,慢指针每次移动一个位置,当快指针到达尾部时,慢指针正好到达了中间位置
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 void reorderList(ListNode* head) { 14 ListNode * leftList = head;//左半部分 15 ListNode * rightList = getMidNode(head);//右半部分 16 ListNode * leftlast = rightList;//左半部分末尾节点 17 rightList = reverseList(rightList);//右半部分逆序操作 18 //依次左半部分、右半部分取节点 19 ListNode * left = leftList; 20 ListNode * right = rightList; 21 ListNode * temp = new ListNode(0); 22 while( left != leftlast || right != nullptr ) 23 { 24 if( left != leftlast ) 25 { 26 temp->next = left; 27 temp = temp->next; 28 left = left->next; 29 } 30 if( right != nullptr ) 31 { 32 temp->next = right; 33 temp = temp->next; 34 right = right->next; 35 } 36 } 37 head = temp->next; 38 } 39 //双指针获取链表中间节点 40 ListNode* getMidNode(ListNode* head) 41 { 42 ListNode * fast = head; 43 ListNode * slow = head; 44 while(fast && fast->next) 45 { 46 fast = fast->next; 47 fast = fast->next;//快指针一次走两步 48 slow = slow->next;//慢指针一次走一步 49 } 50 return slow; 51 } 52 //链表的逆序操作 53 ListNode * reverseList(ListNode* head) 54 { 55 ListNode * prenode = nullptr;//前个节点 56 ListNode * node = head;//当前节点 57 ListNode * nextnode = head;//下个节点 58 while( node ) 59 { 60 nextnode = node->next;//保存下个节点 61 node->next = prenode; //当前节点连到上个节点 62 prenode = node;//更新上个节点 63 node = nextnode ;//更新当前节点 64 } 65 return prenode; 66 } 67 }; 68 69 70 作者:li-zhi-chao-4 71 链接:https://leetcode-cn.com/problems/reorder-list/solution/lian-biao-de-zhong-jian-jie-dian-ni-xu-he-bing-by-/ 72 来源:力扣(LeetCode) 73 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。