雙指針算法框架

  • 快慢指針(主要解決鏈表中的問題)

    • 鏈表中是否包括環,進而求鏈表中環的入口節點
    • 鏈表的中間節點(重要作用就是對鏈表進行歸併排序)
    • 鏈表的倒數第k個節點
    • 等等
  • 左右指針(主要解決數組(或者字符串)中的問題)

    • 二分查找
    • 求排序樹組中和爲sum的兩個數
    • 反轉數組(字符串)
    • 滑動窗口(雙指針技巧的最高境界)
    • 等等(代碼就不寫了,前面寫過)

快慢指針常用算法

// 1、快慢指針判斷鏈表是否包含環並且返回環的入口節點
ListNode* hasCycle(ListNode* pHead){

    ListNode* fast = pHead;
    ListNode* slow = pHead;

    while(fast != nullptr && fast->next != nullptr){
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
            break;
    }

    // 沒有環則返回
    if(fast == nullptr && fast->next == nullptr)
        return nullptr;

    slow = pHead;
    while(slow != fast){
        slow = slow->next;
        fast = fast->next;
    }
    return fast;
}
// 2、鏈表的中間節點
ListNode* middleNode(ListNode* pHead){
    if(pHead == nullptr)
        return nullptr;
    ListNode* fast = pHead;
    ListNode* slow = pHead;

    while(fast != nullptr && fast->next != nullptr){
        fast = fast->next->next;
        slow = slow->next;
    }
    // 有奇數個節點(fast->next == nullptr),slow剛好是中間節點,有偶數個節點(fast == nullptr),slow是中間偏右一個節點
    return slow;
}

// 3、鏈表的倒數第k個節點(這裏簡化一下加入鏈表節點大於k個)
ListNode* lastOfKthNode(ListNode* pHead){
    if(pHead == nullptr || k == 0)
        return nullptr;
    ListNode* fast = pHead;
    ListNode* slow = pHead;
    // 先讓快指針走k個節點
    while(k--)
        fast = fast->next;
    while(fast != nullptr){
        slow = slow->next;
        fast = fast->next;
    }
    return slow;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章