链接:面试题 02.07. 链表相交 - 力扣(Leetcode)
题目:
思路:
- 首先要明确,寻找相交节点指的是curA=curB(包括节点下标(从尾节点开始计算)和数值),而不是指valA=calB(!!!)
- 由此,需要用到两个指针,分别用于遍历一条链表
- 分别遍历一次记录两条链表的长度,通过比较两条链表的长度确定哪一条的cur指针需要先右滑
- 计算出两条链表长度的差值n,较长的链表先右滑n个节点,目的是为了能使相交的节点位置相同(从尾节点开始计算)
- 遍历找到相交的节点,输出其中一个cur节点,遍历结束未找到输出null
遇到的问题:
一开始忘记了如何在找不到相交节点时输出null(以A链表长于B链表为例)
if(i>j)
{
for(int z=0;z<i-j;z++)curA=curA->next;
while(curA)//
{
if(curA==curB)return curA;//优先判断
curA=curA->next;
curB=curB->next;
}
return NULL;
}
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
typedef struct ListNode ListNode;
ListNode* curA=headA;
ListNode* curB=headB;
ListNode* tempA=headA;
ListNode* tempB=headB;
int i,j;
for(i=0;tempA!=NULL;i++)tempA=tempA->next;
for(j=0;tempB!=NULL;j++)tempB=tempB->next;
if(i>j)
{
for(int z=0;z<i-j;z++)curA=curA->next;
while(curA)
{
if(curA==curB)return curA;
curA=curA->next;
curB=curB->next;
}
return NULL;
}else{
for(int z=0;z<j-i;z++)curB=curB->next;
while(curB)
{
if(curA==curB)return curA;
curA=curA->next;
curB=curB->next;
}
return NULL;
}
}