A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
第一种:分别遍历两个链表,得到分别对应的长度。然后求长度的差值,把较长的那个链表向后移动这个差值的个数,然后一一比较即可。
/** * 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 *node1=headA; ListNode *node2=headB; if(node1==NULL||node2==NULL) return NULL; int len1=length(headA); int len2=length(headB); printf("%d %d\n",len1,len2); if(len1<len2) { for(int i=0;i<len2-len1;i++) node2=node2->next; } else if(len1>len2) { for(int i=0;i<len1-len2;i++)//低级错误,我竟然写的len2-len1;看清楚谁大谁小;找错误找了半天真是愚蠢 node1=node1->next; } while(node1!=NULL&&node2!=NULL) { if(node1==node2) return node1; node1=node1->next; node2=node2->next; } return NULL; } int length(ListNode *head) { int ans=0; while(head!=NULL) { ans++; head=head->next; } return ans; } };
第二种:
这道题还有一种特别巧妙的方法,虽然题目中强调了链表中不存在环,但是我们可以用环的思想来做,我们让两条链表分别从各自的开头开始往后遍历,当其中一条遍历到末尾时,我们跳到另一个条链表的开头继续遍历。两个指针最终会相等,而且只有两种情况,一种情况是在交点处相遇,另一种情况是在各自的末尾的空节点处相等。为什么一定会相等呢,因为两个指针走过的路程相同,是两个链表的长度之和,所以一定会相等。(简单高效)
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *node1=headA; ListNode *node2=headB; while(1) { if(node1==node2) return node1; node1=node1?node1->next:headB; node2=node2?node2->next:headA; } } };