本文共 2175 字,大约阅读时间需要 7 分钟。
三种解法实现,第三种有点巧妙,值得考虑:暴力遍历:
/** * 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 *curA=headA,*curB=headB; while(curA!=nullptr){ while(curB!=nullptr){ if(curB==curA) return curA; curB = curB->next; } curA=curA->next; curB = headB; } return nullptr; }};
Hash表:
/** * 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 *curA=headA,*curB=headB; unordered_setdata; while(curA!=nullptr){ data.insert(curA); curA=curA->next; } while(curB!=nullptr){ if(data.find(curB)!=data.end()) return curB; curB = curB->next; } return nullptr; }};
双指针:
/** * 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 *curA=headA,*curB=headB; bool signA=true,signB=true; while(curA!=nullptr||curB!=nullptr){ if(curA==curB&&curA!=nullptr) return curA; curA = curA->next; curB = curB->next; if(curA==nullptr&&signA){ curA=headB; signA=false; } if(curB==nullptr&&signB){ curB=headA; signB=false; } } return nullptr; }};
转载地址:http://uvyci.baihongyu.com/