题目:Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
-
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
- If the two linked lists have no intersection at all, return
题目解答:
判断两个链表是否有交集,并返回相交的第一个节点,若不想交,返回NULL。
首先计算两个链表的长度,让长链表走到短链表头平行的位置之后,两个链表再一起开始走。并一边走,一边来判断是否节点是否相同。
代码如下:
/**
* 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) { int lenA = getListLen(headA); int lenB = getListLen(headB); if((lenA == 0) || (lenB == 0)) return NULL; ListNode *p = headA; ListNode *q = headB; if(lenA > lenB) { int i = lenA - lenB; while(i != 0) { i--; p = p -> next; } } else { int i = lenB - lenA; while(i != 0) { i--; q = q -> next; } } while((p != NULL) && (q != NULL) && (p != q) ) { p = p -> next; q = q -> next; } if(p == q) return p; else return NULL; } int getListLen(ListNode *head) { int len = 0; ListNode *p = head; while(p != NULL) { len++; p = p-> next; } return len; }};