相交链表
编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
又是一个简化时间复杂度的问题,好在O(n^2)的遍历勉强过了可以看大神的解法。。
思路就是把较长的链表削减到和较短的链表一样长,然后遍历一次即可。由于相交的部分一定小于等于较短的链表,因此不用担心削减掉的部分会包含结果。
创新、无中生有总是最难的,还有我头好疼啊,睡不了一个好觉,痛苦。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *p=headA,*q=headB; int size_A=0,size_B=0,offset; while(p) { size_A++; p=p->next; } while(q) { size_B++; q=q->next; } p=headA; q=headB; if(size_B>size_A) { offset=size_B-size_A; while(offset--) q=q->next; } else { offset=size_A-size_B; while(offset--) p=p->next; } while(p&&q) { if(p==q) return p; p=p->next; q=q->next; } return NULL; }