有環單鏈表相交判斷練習題

題目

如何判斷兩個有環單鏈表是否相交?相交的話返回第一個相交的節點,不想交的話返回空。如果兩個鏈表長度分別為N和M,請做到時間復雜度O(N+M),額外空間復雜度O(1)。
給定兩個鏈表的頭結點head1和head2,請返回一個bool值代表它們是否相交。

思路

一共有三種相交的情況:

  1. 在入環的節點相交
  2. 在入環的節點之前相交
  3. 在環中相交

解題的關鍵在于先拿到如環的節點,然后即可對三種情況進行判斷

答案
ListNode* intersectNode(ListNode *head) {
    ListNode *slowNode = head;
    ListNode *fastNode = head;
    while (fastNode->next != NULL && fastNode->next->next != NULL) {
        fastNode = fastNode->next->next;
        slowNode = slowNode->next;
        if (slowNode == fastNode) {
            fastNode = head;
            while (fastNode != slowNode) {
                fastNode = fastNode->next;
                slowNode = slowNode->next;
            }
            return slowNode;
        }
    }
    return NULL;
}

bool chkInter(ListNode* head1, ListNode* head2, int adjust0, int adjust1) {
    ListNode *intersectNode1 = intersectNode(head1);
    ListNode *intersectNode2 = intersectNode(head2);
    // 第一種情況:在環的入口點或者環入口點之前就已經相交
    if (intersectNode1 == intersectNode2) {
        return true;
    }
    // 第二種情況:在環中相交
    ListNode *current = intersectNode1;
    while (1) {
        current = current->next;
        if (current == intersectNode1) {
            break;
        } else if (current == intersectNode2){
            return true;
        }
    }
    return false;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • //leetcode中還有花樣鏈表題,這里幾個例子,冰山一角 求單鏈表中結點的個數----時間復雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,535評論 0 6
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,165評論 0 12
  • 鏈表問題是面試過程中經常被問到的一部分,很考查編程功底。最近刷了 LeetCode 上鏈表部分的面試題,我總結了一...
    JohnnyShieh閱讀 4,984評論 0 9
  • 1. 鏈表 鏈表是最基本的數據結構,面試官也常常用鏈表來考察面試者的基本能力,而且鏈表相關的操作相對而言比較簡單,...
    Mr希靈閱讀 1,472評論 0 20
  • 如何判斷兩個有環單鏈表是否相交?相交的話返回true,不想交的話返回false。如果兩個鏈表長度分別為N和M,請做...
    IT_Matters閱讀 1,337評論 0 1