• LeetCode: Reorder List


    list的题最大的麻烦就在于细节,这题也是弄了挺久,思路很简单,双指针取终点,后面的list反向后搭一起就行了

     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 *reverse(ListNode *head) {
    12         if (!head) return NULL;
    13         ListNode *pre = NULL;
    14         ListNode *next;
    15         next = head->next;
    16         while (head) {
    17             head->next = pre;
    18             pre = head;
    19             head = next;
    20             if (next) next = next->next;
    21         }
    22         return pre;
    23     }
    24     void reorderList(ListNode *head) {
    25         ListNode *p, *q;
    26         p = q = head;
    27         if (!head) return;
    28         while (q) {
    29             q = q->next;
    30             if (!q) break;
    31             q = q->next;
    32             if (!q) break;
    33             p = p->next;
    34         }
    35         ListNode *ppre = p;
    36         p = p->next;
    37         ppre->next = NULL;
    38         q = reverse(p);
    39         p = head;
    40         ListNode *pnext, *qnext;
    41         while (p) {
    42             pnext = p->next;
    43             if (q) qnext = q->next;
    44             else break;
    45             p->next = q;
    46             q->next = pnext;
    47             p = pnext;
    48             q = qnext;
    49         }
    50     }
    51 };

     第二次一次过,用function看起来更加清楚

     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 *reverse(ListNode *head) {
    12         if (!head) return NULL;
    13         ListNode *p = head;
    14         ListNode *pre = NULL;
    15         while (p) {
    16             ListNode *pnext = p->next;
    17             p->next = pre;
    18             pre = p;
    19             p = pnext;
    20         }
    21         return pre;
    22     }
    23     void merge(ListNode *p, ListNode *q) {
    24         ListNode *head = p;
    25         bool flag = true;
    26         while (p && q) {
    27             if (flag) {
    28                 ListNode *pnext = p->next;
    29                 p->next = q;
    30                 p = pnext;
    31                 flag = !flag;
    32             }
    33             else {
    34                 ListNode *qnext = q->next;
    35                 q->next = p;
    36                 q = qnext;
    37                 flag  =!flag;
    38             }
    39         }
    40     }
    41     void reorderList(ListNode *head) {
    42         ListNode *p = head;
    43         ListNode *q = head;
    44         if (!head) return;
    45         while (q && q->next) {
    46             q = q->next->next;
    47             if (!q) break;
    48             p = p->next;
    49         }
    50         q = p->next;
    51         p->next = NULL;
    52         q = reverse(q);
    53         p = head;
    54         merge(p, q);
    55     }
    56 };

     C#

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public int val;
     5  *     public ListNode next;
     6  *     public ListNode(int x) { val = x; }
     7  * }
     8  */
     9 public class Solution {
    10     public void ReorderList(ListNode head) {
    11         ListNode p = head;
    12         ListNode q = head;
    13         if (head == null) return;
    14         while (q != null && q.next != null) {
    15             q = q.next.next;
    16             if (q == null) break;
    17             p = p.next;
    18         }
    19         q = p.next;
    20         p.next = null;
    21         q = reverse(q);
    22         p = head;
    23         merge(p, q);
    24     }
    25     void merge(ListNode p, ListNode q) {
    26         ListNode head = p;
    27         bool flag = true;
    28         while (p != null && q != null) {
    29             if (flag) {
    30                 ListNode pnext = p.next;
    31                 p.next = q;
    32                 p = pnext;
    33                 flag = !flag;
    34             }
    35             else {
    36                 ListNode qnext = q.next;
    37                 q.next = p;
    38                 q = qnext;
    39                 flag = !flag;
    40             }
    41         }
    42     }
    43     public ListNode reverse(ListNode head) {
    44         if (head == null) return null;
    45         ListNode p = head;
    46         ListNode pre = null;
    47         while (p != null) {
    48             ListNode pnext = p.next;
    49             p.next = pre;
    50             pre = p;
    51             p = pnext;
    52         }
    53         return pre;
    54     }
    55 }
    View Code
  • 相关阅读:
    Cesium视角
    Cesium删除特定的实体
    cesium之CLAMPED
    JavaScript:使用setAttribute()改变网页中标签的onclick属性
    atoi()函数及其实现
    寻找数组中的第二大数
    字符串函数之strcpy
    互换两个变量(不使用中间变量)
    寻找兄弟单词(2012.5.6百度实习)
    大数据量的存储分表常见算法(转)
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/3515900.html
Copyright © 2020-2023  润新知