LeetCode 160. 相交連結串列(找兩個無環單鏈表的相交起點)
阿新 • • 發佈:2021-02-09
題意:
編寫一個程式,找到兩個單鏈表相交的起始節點。
例如,下圖中c1就是要求的結點:
解法1:
將兩個連結串列拼接,那麼問題變為判斷是否有環,如果有則返回環入口。
找環入口做法:LeetCode 142. 環形連結串列 II
程式碼裡我是直接將連結串列B接到連結串列A後面,提交WA了,顯示連結串列不能修改,
因此需要在return之前將A連結串列的末尾還原為NULL。
(或者可以嘗試模擬拼接,而不是真的拼接?)
ps:
另外,如果這題不需要求入口,只需要判斷是否相交,
根據相交位置之後結點相同的特性,只需要判斷兩連結串列的尾結點是否相同就行了,
做法很簡單,分別遍歷到尾結點,判斷是否相同即可。
code1:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA||!headB)return NULL;
//拼接
ListNode *tail=headA;
while(tail->next){
tail=tail->next;
}
tail->next=headB;
//
ListNode *x=headA,*y=headA;
while(y){
y=y->next;
if(!y){
tail->next=NULL;//還原
return NULL;
}
y=y->next;
if(!y){
tail->next=NULL;//還原
return NULL;
}
x=x->next;
if(y==x){
ListNode *p=headA;
while(p!=x){
p=p->next;
x=x->next;
}
tail->next=NULL;//還原
return x;
}
}
tail->next=NULL;//還原
return NULL;
}
};