1. 程式人生 > 其它 >LeetCode 160. 相交連結串列(找兩個無環單鏈表的相交起點)

LeetCode 160. 相交連結串列(找兩個無環單鏈表的相交起點)

題意:

編寫一個程式,找到兩個單鏈表相交的起始節點。

例如,下圖中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; } };