赞
踩
给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。图示两个链表在节点
c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal
- 相交的起始节点的值。如果不存在相交节点,这一值为0
listA
- 第一个链表listB
- 第二个链表skipA
- 在listA
中(从头节点开始)跳到交叉节点的节点数skipB
- 在listB
中(从头节点开始)跳到交叉节点的节点数评测系统将根据这些输入创建链式数据结构,并将两个头节点
headA
和headB
传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
依次去A链表中的每个节点跟B链表中的所有节点比较,如果有地址相同的节点,就是相交,第一个相同的就是交点
时间复杂度为O(N^2),非常麻烦,这里就不多说了,我们直接来说思路二
核心:尾结点相同,就是相交否则就不相交,长的链表先走长度差步,再同时走,第一个相同的就是交点
先保存两个头结点用来比较长度,因为我遍历完了两个链表,所以把是不是相交一起判断了
- //先保存两个头结点用来比较长度
- struct ListNode* tailA = headA;
- struct ListNode* tailB = headB;
- //计算A的长度
- int lenA = 1;
- while (tailA->next != NULL)
- {
- lenA++;
- tailA = tailA->next;
- }
- //计算B的长度
- int lenB = 1;
- while (tailB->next != NULL)
- {
- lenB++;
- tailB = tailB->next;
- }
- //是不是相交一起判断
- if (tailA != tailB)
- {
- return NULL;
- }
这个用了一个非常巧妙的办法来写出了如何判断这两个长,因为我不知道这两个最开始到底是谁长
- //abs取绝对值
- int gap = abs(lenA - lenB);
- //先假设A长
- struct ListNode* long = headA;
- struct ListNode* short = headB;
- //在做出判断,如果A短就互换
- if (lenA < lenB)
- {
- struct ListNode* long = headB;
- struct ListNode* short = headA;
- }
- //长的先走gap步
- while (gap--)
- {
- long = long->next;
- }
- //等长的走完,在一起走,之后返回向遇点就可以了
- while (long != short)
- {
- long = long->next;
- short = short->next;
- }
- //返回short也可以
- return long;
- struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
- {
- //先保存两个头结点用来比较长度
- struct ListNode* tailA = headA;
- struct ListNode* tailB = headB;
- //计算A的长度
- int lenA = 1;
- while (tailA->next != NULL)
- {
- lenA++;
- tailA = tailA->next;
- }
- //计算B的长度
- int lenB = 1;
- while (tailB->next != NULL)
- {
- lenB++;
- tailB = tailB->next;
- }
- if (tailA != tailB)
- {
- return NULL;
- }
- //abs取绝对值
- int gap = abs(lenA - lenB);
- //先假设A长
- struct ListNode* long = headA;
- struct ListNode* short = headB;
- //在做出判断,如果A短就互换
- if (lenA < lenB)
- {
- struct ListNode* long = headB;
- struct ListNode* short = headA;
- }
- //长的先走gap步
- while (gap--)
- {
- long = long->next;
- }
- //等长的走完,在一起走,之后返回向遇点就可以了
- while (long != short)
- {
- long = long->next;
- short = short->next;
- }
- //返回short也可以
- return long;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。