[leetcode]reorder-list

妖狐艹你老母 2022-03-20 10:06 233阅读 0赞

题目描述:

Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L nL 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}.

实现思路:

For example,利用快慢指针找到中间节点,将链表分成前后两段,翻转后半段,然后再将两段合并,前一个后一个前一个后一个……这样子把后半段的插到前半段中去。

具体实现:

  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. void reorderList(ListNode *head) {
  12. if(!head || !head->next){
  13. return;
  14. }
  15. //快慢指针找到中间节点
  16. ListNode *fast = head;
  17. ListNode *slow = head;
  18. while(fast->next && fast->next->next){
  19. fast = fast->next->next;
  20. slow = slow->next;
  21. }
  22. //拆分链表,翻转后半部分链表
  23. ListNode *after = slow->next;
  24. slow->next = nullptr;
  25. ListNode *pre = nullptr;
  26. while(after){
  27. ListNode *temp = after->next;
  28. after->next = pre;
  29. pre = after;
  30. after = temp;
  31. }
  32. //合并两个链表
  33. ListNode *first = head;
  34. after = pre;
  35. while(first && after){
  36. ListNode *ftemp = first->next;
  37. ListNode *aftemp = after->next;
  38. first->next = after;
  39. first = ftemp;
  40. after->next = first;
  41. after = aftemp;
  42. }
  43. }
  44. };

哎喂 对于链表的理解还非常不熟练啊 多练多练呀呀呀!!!

发表评论

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

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

相关阅读