資料結構 兩個單鏈表相交的一系列問題

2021-09-06 09:38:45 字數 2356 閱讀 3574

這個是乙個比較綜合的問題:

該題可以分解為三個問題:

#include "myinclude.h"

/* 問題一:

判斷乙個鍊錶是否有環.

如果有,返回第乙個進入環的節點.

如果沒有,返回null

*/// 快慢指標,若存在環,則一定會在環中的某乙個節點相遇.

// 然後再找第入口

// listnode* getloopnode(listnode* head)

// 初始值,slow走了一步,fast走了兩步

listnode* slow = head->next;

listnode* fast = head->next->next;

while (slow != fast)

slow = slow->next;

fast = fast->next->next;

} // 存在環,找環的第乙個節點.

slow = head;

while (slow != fast)

return slow;

}

/*

若兩個無環鏈表相交,返回相交節點,

否則,返回null

*/int getlen(listnode* head)

return len;

}listnode* noloop(listnode* head1, listnode* head2)

int absdiff = (len1 - len2);

while (absdiff != 0)

while (p1 != null&&p2 != null&&p1 != p2)

if (p1 == null || p2 == null)

else

}

/*

判斷兩個有環鏈表是否相交

若相交,返回第乙個相交點

若不相交,返回null

*/// 求出有環鏈表的環入口節點

listnode* getloopenter(listnode* head)

slow = head;

while (slow != fast)

return slow;

}listnode* bothloop(listnode* head1, listnode* head2)

// 不相等,則遍歷一遍乙個環自身,看是否能找到另乙個環的入口節點,有則為相交,沒有則為不相交

listnode* p = loop1->next;

while (p != loop1)

p = p->next;

} return null;

}

/*

檢測兩個單鏈表是否相交,

若相交,返回第乙個相交的節點

若不相交,返回null

*//*

分析:若乙個鍊錶有環,乙個鍊錶沒有換,則不可能相交

若兩個單鏈表都有環,

則需要檢測兩個有環鏈表是否相交

若二者都沒有,

則判斷兩個無環的單鏈表是否相交

*/// 1.判斷乙個鍊錶是否有環

listnode* hasloop(listnode* head)

slow = slow->next;

fast = fast->next->next;

} slow = head;

while (slow != fast)

return slow;

}// 2.兩個無環鏈表是否相交

int getlen(listnode* head)

return len;

}listnode* noloop(listnode* head1, listnode* head2)

int absdiff = (len1 - len2);

while (absdiff != 0)

while (p1 != null&&p2 != null&&p1 != p2)

if (p1 == null || p2 == null) else

}// 3.兩個有環鏈表是否相交,

listnode* bothloop(listnode* loop1, listnode* loop2)

else

return null; }}

listnode* getintersectnode(listnode* head1, listnode* head2)

if (loop1 != null&&loop2 != null)

return null;

}

兩個單鏈表相交的一系列問題

兩個單鏈表相交的一系列問題 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回 null 即可。如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時...

兩個單鏈表相交的一系列問題

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外空間複雜度...

兩個單鏈表相交的一系列問題

兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度...