單鏈表判環判相交綜合題

2021-08-07 02:04:04 字數 3219 閱讀 4226

給定兩個單鏈表的頭節點head1和head2,單鏈表可能有環,也可能無環。如何判斷兩個鍊錶是否相交?相交的話返回相交的第乙個節點,不想交的話返回null。

要求:如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度o(n+m),額外空間複雜度o(1)。

首先我們先判定兩個鍊錶是否有環,如果只有其中乙個鍊錶有環,乙個鍊錶無環,那證明這兩個鍊錶不會相交。然後再分成都有環和無環情況分別分析。

都無環的情況:先求得每一鍊錶的環的入口節點loop1和loop2。可參見

**如下:

listnode *getloopnode(listnode *head)

listnode *pslow=head->next;

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

while(pslow!=pfast)

pslow=pslow->next;

pfast=pfast->next->next;

}pfast=head;

while(pslow!=pfast)

return pslow;

}

無環的情況有兩種可能,分別如下:

這種情況的求解的基本思想如下:

先求出兩個鍊錶長度的差值n,讓長鍊表先走n步,然後一起走,如果能相遇則證明兩個鍊錶有相交,反之則沒有。

**如下:

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

listnode *cur1=head1;

listnode *cur2=head2;

int n=

0; while(cur1->next!=

null)

while(cur2->next!=

null)

if(cur1!=cur2)

cur1=n>

0?head1:head2;

cur2=cur1==head1?head2:head1;

n=abs(n);

while(n!=

0) while(cur1!=cur2)

return cur1;

}

都有環的情況下:有如下三種可能

**如下:

lisnode * bothloop(listnode *head1,listnode *loop1,listnode *head2,listnode *loop2)

while(cur2!=loop2)

cur1=n>0?head1:head2;

cur2=cur1==head1?head2:head1;

n=abs(n);

while(n!=0)

while(cur1!=cur2)

return cur1;

}else

cur1=cur1->next;

}return null;}}

#include

#include

using namespace std;

struct listnode

}; listnode *getloopnode(listnode *);

listnode *noloop(listnode *,listnode *);

listnode *bothloop(listnode *,listnode*,listnode *,listnode*);

listnode *chkinter(listnode* head1, listnode* head2)

if(loop1!=

null

&&loop2!=

null)

return

null;

}int main()

listnode *getloopnode(listnode *head)

listnode *pslow=head->next;

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

while(pslow!=pfast)

pslow=pslow->next;

pfast=pfast->next->next;

}pfast=head;

while(pslow!=pfast)

return pslow;

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

listnode *cur1=head1;

listnode *cur2=head2;

int n=

0; while(cur1->next!=

null)

while(cur2->next!=

null)

if(cur1!=cur2)

cur1=n>

0?head1:head2;

cur2=cur1==head1?head2:head1;

n=abs(n);

while(n!=

0) while(cur1!=cur2)

return cur1;

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

while(cur2!=loop2)

cur1=n>

0?head1:head2;

cur2=cur1==head1?head2:head1;

n=abs(n);

while(n!=

0) while(cur1!=cur2)

return cur1;

}else

cur1=cur1->next;

}return

null;}}

輸出:

單鏈表判環判交問題

摘要 有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?擴充套件 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點。有乙個單鏈表,其中可能有乙個環,也就是某...

C 單鏈表 判環

題源 牛客網 直通bat面試演算法精講課 題目 給定乙個單鏈表的頭結點head,判斷其是否有環,無環返回 1 有環返回 入環 的 第乙個 結點的 數值。要求 如果鍊錶長度是n個節點,請做到 時間複雜度為o n 額外空間複雜度為o 1 演算法思想的說明 1.單鏈表 每個結點只有 乙個next域 或者稱...

單鏈表判環的討論

聊天時聽到的這個問題,即有乙個單鏈表,可能有環 見圖 請判斷出是否存在這個環?貌似這是很常見的面試題 我居然沒印象 既然有個環,那就直接遍歷一遍環唄,用個陣列標記一下。時間複雜度和空間複雜度都是o n 這個思路的問題就是在於空間複雜度是o n 所以面試中,面試官總會再問,有沒有更好的解決方法。然後我...