LeetCode-剑指 Offer 52. 两个链表的第一个公共节点
劍指 Offer 52. 兩個鏈表的第一個公共節(jié)點
思路一:用set容器,不符合題意
/*** 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) {set<ListNode*> mySet;while(headA!=nullptr){mySet.insert(headA);headA = headA->next;}while(headB!=nullptr){if(mySet.find(headB)!=mySet.end()){return headB;}else{headB = headB->next;}}return nullptr;} };思路二:雙指針
解題思路:
我們使用兩個指針 node1,node2 分別指向兩個鏈表 headA,headB 的頭結(jié)點,然后同時分別逐結(jié)點遍歷,當 node1 到達鏈表 headA 的末尾時,重新定位到鏈表 headB 的頭結(jié)點;當 node2 到達鏈表 headB 的末尾時,重新定位到鏈表 headA 的頭結(jié)點。
這樣,當它們相遇時,所指向的結(jié)點就是第一個公共結(jié)點。
作者:z1m
鏈接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/solution/shuang-zhi-zhen-fa-lang-man-xiang-yu-by-ml-zimingm/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
我的理解: 兩個鏈表長度分別為L1+C、L2+C, C為公共部分的長度,按照樓主的做法: 第一個人走了L1+C步后,回到第二個人起點走L2步;第2個人走了L2+C步后,回到第一個人起點走L1步。 當兩個人走的步數(shù)都為L1+L2+C時就兩個家伙就相愛了
/*** 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 == nullptr || headB == nullptr) {return nullptr;}ListNode* node1 = headA;ListNode* node2 = headB;while(node1 !=node2 ){node1 = node1!=nullptr ? node1->next : headB;node2 = node2!=nullptr ? node2->next : headA;}return node1;} };總結(jié)
以上是生活随笔為你收集整理的LeetCode-剑指 Offer 52. 两个链表的第一个公共节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode-剑指 Offer 22
- 下一篇: LeetCode-剑指 Offer 58