LeetCode 160
Intersection of Two Linked Lists
Problem Description:
找出两个单链表的公共节点
Solution:
- 解题思路
如果两个单链表有公共结点,那么在公共结点之后的结点必然重合,因为每个链表结点只有一个next域。故我们顺序遍历两个链表,寻找相同结点。由于两个链表长度不同,所以我们要先在长链表上遍历长链表比短链表多出来的k个结点,然后同步遍历寻找相同的结点。 - 编程实现
(1)getlen函数得到两个链表的长度
(2)用diff变量记录长度差,长链表先遍历diff个结点,再同步遍历
- 解题思路
/**
* 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) {
if (headA == NULL)
return headA;
if (headB == NULL)
return headB;
int lenA = getlen(headA);
int lenB = getlen(headB);
ListNode* longlist = headA;
ListNode* shortlist = headB;
int diff = lenA-lenB;
if (lenA < lenB) {
longlist = headB;
shortlist = headA;
diff = lenB-lenA;
}
while(diff--) {
longlist = longlist->next;
}
while(longlist) {
if (longlist == shortlist)
return longlist;
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}
int getlen(ListNode *t) {
ListNode* temp = t;
int len=0;
while(temp) {
temp = temp->next;
len++;
}
return len;
}
};