输入两个链表,找出它们的第一个公共节点。
普通办法,对A链表每个节点都遍历B链表,看有没有相同,时间复杂度mn。
用空间换时间,因为链表只要遇到第一个相同的节点,后面的节点都相同,也就是说可以从链表尾往回找。但是因为缺乏往回的指针,所以使用栈,两个栈分别把两个链表的所有节点压进去,然后再一对一对弹出并检查,时间复杂度max(m,n),需要m+n的辅助空间。
其实这也可以使用双指针,两个指针保持相同的距离。先遍历一遍两个链表记录他们的长度,长度差为diff,让长的那一侧先走diff,然后两个同步前进,遇到的第一个相同的节点就是答案。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 12 if(headB==nullptr || headA==nullptr) 13 return nullptr; 14 ListNode* dummyA=headA,*dummyB=headB; 15 int lena=0,lenb=0; 16 while(headA!=nullptr){ 17 headA=headA->next; 18 lena++; 19 } 20 while(headB!=nullptr){ 21 headB=headB->next; 22 lenb++; 23 } 24 int diff=lenb-lena; 25 while(diff>0){ 26 dummyB=dummyB->next; 27 diff--; 28 } 29 while(diff<0){ 30 dummyA=dummyA->next; 31 diff++; 32 } 33 while(dummyA!=nullptr){ 34 if(dummyA==dummyB) 35 break; 36 dummyA=dummyA->next; 37 dummyB=dummyB->next; 38 } 39 return dummyB; 40 } 41 };