160. 相交链表
描述:
思路:
- 只看示意图, 可以一下理解题意, 需要注意到的是, 所谓的相交, 并非只是单单仅仅指链表的数据域里面的值相等(我一开始就打算暴力遍历然后一个一个比较值).
- 相交是指, 两个链表的相交点后的元素完全相同, 也即找到那个相交点(两个指针指向同一个元素的位置)
- 想通了上面一点题目就可以写出来.
- 可以直接同时遍历两个链表, 看当前遍历的两个链表元素的指针域是否指向同一个地址, 如果是的话, 即为相交点.(即双指针法)
- 这其中的难点是, 当两个链表长度相等的时候, 可以直接进行遍历, 但是如果不相等, 及一个链表长一个链表短, 如果都从头开始遍历的话会导致长链表遍历不够. 故有两种解决办法:
- 先依次求出两个链表的长度. 若两个链表长度不同, 长链表先遍历至和短链表相同的长度, 继续进行遍历.
- 遍历到结尾后, 交换, 类似等待的机制, 使两个链表遍历的位置同步.
代码:
-
遍历到结尾交换
/* * @lc app=leetcode.cn id=160 lang=cpp * * [160] 相交链表 */ // @lc code=start /** * 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 == nullptr || headB == nullptr) { return nullptr; } ListNode *curA = headA; ListNode *curB = headB; while (curA != curB) { curA = curA == nullptr ? headB : curA->next; curB = curB == nullptr ? headA : curB->next; } return curA; } }; -
求两链表长度
/* * @lc app=leetcode.cn id=160 lang=cpp * * [160] 相交链表 */ // @lc code=start /** * 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 = 0, lenB = 0; ListNode *curA = headA; ListNode *curB = headB; while (curA) { lenA++; curA = curA->next; } while (curB) { lenB++; curB = curB->next; } curA = headA; curB = headB; if (lenA > lenB) { for (int i = 0; i < lenA - lenB; i++) { curA = curA->next; } } else { for (int i = 0; i < lenB - lenA; i++) { curB = curB->next; } } while (curA != curB) { curA = curA->next; curB = curB->next; } return curA; } };
参考:
[1] LeetCode官方题解