1. 程式人生 > >【第一部分】10Leetcode刷題

【第一部分】10Leetcode刷題

ast image etc return pan 結點 node rem color

一、刪除鏈表的倒數第N個節點

題目:19. Remove Nth Node From End of List

分析:典型的利用雙指針法解題。首先讓指針first指向頭節點,然後讓其向後移動n步,接著讓指針sec指向頭結點,並和first一起向後移動。當first的next指針為NULL時,sec即指向了要刪除節點的前一個節點,接著讓first指向的next指針指向要刪除節點的下一個節點即可。註意如果要刪除的節點是首節點,那麽first向後移動結束時會為NULL,這樣加一個判斷其是否為NULL的條件,若為NULL則返回頭結點的next指針。

環形鏈表

題目:141. Linked List Cycle

解法一:

 1 class Solution {
 2 public:
 3     bool hasCycle(ListNode *head) 
 4     {
 5         ListNode *slow = head, *fast = head;
 6         while (fast && fast->next) 
 7         {
 8             slow = slow->next;
 9             fast = fast->next->next;
10             if
(slow == fast) return true; 11 } 12 return false; 13 } 14 };

二、環形鏈表 II

題目:142. Linked List Cycle II

如下圖所示,X,Y,Z分別為鏈表起始位置,環開始位置和兩指針相遇位置,則根據快指針速度為慢指針速度的兩倍,可以得出:

2*(a + b) = a + b + n * (b + c);即:a=(n - 1) * b + n * c = (n - 1)(b + c) +c; 註意到b+c恰好為環的長度,故可以推出,如將此時兩指針分別放在起始位置和相遇位置,並以相同速度前進,當一個指針走完距離a時,另一個指針恰好走出 繞環n-1圈加上c的距離。故兩指針會在環開始位置相遇。 技術分享圖片

解法一:

 1 class Solution {
 2 public:
 3     ListNode *detectCycle(ListNode *head)
 4     {
 5         if (head == NULL || head->next == NULL)
 6             return NULL;
 7         ListNode * p = head;
 8         ListNode * q = head;
 9         while (q != NULL && q->next != NULL)//第一次pq相遇
10         {
11             p = p->next;
12             q = q->next->next;
13             if (p == q)  break;
14         }
15 
16         if (p == q)
17         {
18             p = head;
19             while (p != q)//從起點開始,在入口點相遇
20             {
21                 p = p->next;
22                 q = q->next;
23             }
24             return p;
25         }
26         return NULL;
27     }
28 };

【第一部分】10Leetcode刷題