目录
前言
一,思路
1)暴力
2)同步指针
二,代码实现
前言
依旧是力扣上的一道题,有许多新思路提供给我们
160. 相交链表 - 力扣(LeetCode)https://leetcode.cn/problems/intersection-of-two-linked-lists/
我们先来分析题干,相交链表这个相交值得我们去思考一下,我们平常惯性思维的相交都是X型的,要注意单链表的相交并不是简单的X型相交,而是如图所示的Y字型相交,因为我们知道单链表的节点里存储数据和 next 指针,当两个链表的某一个节点的next指针都指向同一个节点时,两链表相交,但无论如何一个节点只能存储一个next指针,所以交汇之后只能形成Y字型的相交。
题目要求大致总结以下两点:
- 判断是否相交
- 若相交,找出第一个交点
一,思路
我们之前做过的一道题讲了一个链表很好用的思路叫逆置,但在这道题中,假设我们逆置来做,则无法使c1节点有俩next指针,所以这个方法哒咩
对于第一个要求,我们可以判断尾指针,注意用地址判断
1)暴力
给两个指针将两个链表的节点都比较一遍,找出相同的节点的即为所求
但时间复杂度会高很多O(N^2)
2)同步指针
先找出两个链表同时的节点,例如找出短链表的头节点对应的长链表的节点 a1和b2,两个指针从这开始遍历无需一一比对节点是否相同
二,代码实现
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curA = headA, *curB = headB;int lenA = 1, lenB = 1;while(curA->next){curA = curA->next;++lenA;}while(curB->next){curB = curB->next;++lenB;}//尾节点不相等就是不相交if(curA != curB){return NULL;}//长节点先走差距步,再同时走,第一个像等的就是交点//假设法int gap = abs(lenA - lenB);struct ListNode *longList = headA, *shortList = headB;if(lenB > lenA){longList = headB;shortList = headA;}while(gap--){longList = longList->next;}while(longList != shortList){longList = longList->next;shortList = shortList->next;}return shortList;
}
因为无需一一比对,所以空间复杂度为O(N)