160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思路:
双指针法
创建两个指针 pA 和 pB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。当 pA 到达链表的尾部时,将它重定位到链表 B 的头结点; 类似的,当 pB 到达链表的尾部时,将它重定位到链表 A 的头结点。若在某一时刻 pA 和 pB 相遇,则 pA/pB 为相交结点。pA 和 pB 两个指针走的长度都为 len_A + len_B。如果两个链表存在相交,它们必会走过一段相同的路程,也就是说他们的末尾的结点必然相同。因此当 pA/pB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。
代码:
/** * 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) { ListNode *a = headA, *b = headB; if(!a||!b) return NULL; while(a||b) { if(a==b) return a; if(!a->next&&b->next) { a = headB; b = b->next; } else if(a->next&&!b->next) { a = a->next; b = headA; } else if(!a->next&&!b->next) return NULL; else { a = a->next; b = b->next; } } return NULL; } };
posted on 2020-10-07 20:31 Little-Prince 阅读(157) 评论(0) 编辑 收藏 举报