判断链表相交
鏈表相交
leetcode題目第141道問題描述:
給你兩個單鏈表的頭節點 headA 和 headB , 請你找出并返回兩個單鏈表相交的起始節點。 如果兩個鏈表不存在相交節點,返回 null 。例如:
 
 (圖片來自LeetCode,侵刪)
解題思路
步驟1.
首先需要判斷兩個鏈表是否相交,畢竟鏈表相交才能進行下一步操作。
 但怎么判斷兩個鏈表怎么相交呢?很簡單,判斷兩個鏈表的尾結點是否為同一個結點
 只要兩鏈表的最后一個結點是同一個結點,那么鏈表必定相交,此結論可通過畫出鏈表結點圖可得出。
步驟2.
在得出兩鏈表相交的情況下,來返回兩個鏈表相交的起始節點。
 首先分別獲取兩個鏈表的長度lenListA與lenListB,然同用快慢指針法,先讓較長的鏈表走N步,N=(lenListA-lenListB)的絕對值。然后兩個鏈表再同時走,直到兩個鏈表的結點是一樣的,此時這個結點就是兩個鏈表相交的起始節點
 例如:
 
 此時較長的鏈表為B,所以讓鏈表B先走N步。
代碼實現
方法一:快慢指針法
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *data=NULL;struct ListNode *curHeadA=headA;struct ListNode *curHeadB=headB;int lenA=1,lenB=1;/*獲取兩個鏈表長度*//*并將兩鏈表分別迭代到各自尾節點*/while(curHeadA->next != NULL){++lenA;curHeadA=curHeadA->next;}while(curHeadB->next != NULL){++lenB;curHeadB=curHeadB->next;}//如果尾結點不相等,那么就是不相交if(curHeadA != curHeadB){return NULL;}//獲得兩個鏈表長度的差值int gap=abs(lenA-lenB); //注意abs是獲取絕對值函數//默認headA為長鏈表struct ListNode *LongList=headA;struct ListNode *shortList=headB; //如果是headB為更長的鏈表,則將LongListA與shortList調換指向對象if(lenA < lenB){LongList=headB;shortList=headA;}//longlist 指向更長的那條鏈表//然后再先走 長度的差值步while(gap--){LongList=LongList->next;}//兩個指針一起走到相交結點就退出while(LongList != shortList){LongList=LongList->next;shortList=shortList->next;}//返回相交結點return LongList; }運行結果:
 
方法二:暴力迭代法
注意:不推介使用這個方法解這個題目,因為時間復雜度太大了,可能在面試中用這個解法容易被面試官叉出去(doge)
思路:
將鏈表A的每一個節點和鏈表B的每一個節點比較一遍,如果有節點相等的則返回相等節點, 如果比較循環結束后那么默認沒有相交節點。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curHeadA=headA;struct ListNode *curHeadB=headB;/*暴力循環破解*/while(curHeadA !=NULL){curHeadB=headB;while(curHeadB != NULL){//當兩鏈表節點相等時,代表兩鏈表相交,并返回相交的起始節點if(curHeadA == curHeadB){return curHeadA;}curHeadB=curHeadB->next; }curHeadA=curHeadA->next;}return NULL;}運行結果:
 
總結
個人覺得這個題目主要考察的是對快慢指針的認知,如有錯誤,歡迎指出,共同進步。
總結
 
                            
                        - 上一篇: 钱钱钱
- 下一篇: vconsole 轻松实现移动端调试
