文章目錄
- 一、前言
- 二、OJ續享
- 2.1相交鏈表
- 2.2環形鏈表1
- 2.2環形鏈表2
- 三、總結
一、前言
哦了兄弟們,咱們上次在詳解鏈表OJ題的時候,有一部分OJ題呢up并沒有整理完,這一個星期呢,up也是在不斷的學習并且沉淀著,也是終于把剩下的題給整理完畢了,現在繼續分享給大家。
二、OJ續享
2.1相交鏈表
力扣160 相交鏈表鏈接
首先咱們先來判斷什么樣的鏈表才是相交鏈表:
畫圖展示:
那么在判斷完畢之后,我們又該如何實現呢?(解題思路請看圖中文字)
代碼展示:
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {ListNode* pa = headA;ListNode* pb = headB;int sizeA = 0;int sizeB = 0;while(pa){sizeA++;//計算A鏈表的節點個數pa = pa->next;}while(pb){sizeB++;//計算B鏈表的結點個數pb = pb->next;}int gap = abs(sizeA-sizeB);//計算差值ListNode* shorth = headA;ListNode* longth = headB;if(sizeA>sizeB)//確定到底誰是長鏈表,誰是短鏈表{longth = headA;shorth = headB;}while(gap--){longth = longth->next;//讓長鏈表先走gap步}while(longth)//遍歷找尋兩個鏈表是否有相同結點{if(longth==shorth){return longth;}shorth = shorth->next;longth = longth->next;}return NULL;
}
2.2環形鏈表1
力扣141 環形鏈表1鏈接
咱們還是先來判斷怎樣才是一個環形鏈表:
畫圖展示(解題思路請看圖中文字):
代碼展示:
typedef struct ListNode ListNode;//快慢指針
bool hasCycle(struct ListNode *head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){return true;}}return false;
}
2.2環形鏈表2
力扣142 環形鏈表2鏈接
剛剛我們實現了如何判斷環形鏈表,那我們現在再來升級一下難度,在判斷完是環形鏈表之后,再返回這個環開始的第一個結點。那么又具體怎么實現呢
畫圖展示(解題思路請看圖中文字):
代碼展示:
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){ListNode* pcur = head;while (pcur != slow){pcur = pcur->next;slow = slow->next;}return pcur;}}return NULL;
}
三、總結
到這里,數據結構——鏈表的一些基礎的經典OJ題up就給大家全部分析完畢了。可能有一些寶子會比較疑惑——關于環形鏈表,快慢指針不是用來找鏈表的中間結點的嗎?為什么這里也同樣適用呢?我只能說,這個問題問得太好了。但是up這次先不給大家證明,我先把這個問題留給大家,寶子們可以開動你們的靈活小腦袋想想,后續up會專門出一期關于數學證明環形指針的內容(如果你們已經證明出來了,可以給我留言看咱們的思路是否相同),大家敬請期待哦。最后,希望大家可以一鍵三連,謝謝大家!
每一次揮汗如雨,都是通往成功路上的堅實步伐。