LeetCode 160 Intersection of Two Linked Lists(链表相交)(Linked List)(*)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50572819 翻译写一个程序来找出两个单链表相交的开始处。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50572819

翻译

写一个程序来找出两个单链表相交的开始处。

例如,如下有两个链表:

这里写图片描述

在节点c1处开始相交。

批注:
如果两个链表根本没有相交,返回NULL。
在函数返回后链表必须保留原有的数据结构。
你可以假设在整个链结构中没有循环。
你的代码最后可以在O(n)时间和O(1)空间运行。

原文

Write a program to find the node at which the intersection of two singly linked lists begins.


For example, the following two linked lists:

这里写图片描述

begin to intersect at node c1.


Notes:

If the two linked lists have no intersection at all, return null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.

分析

注意这里的情况是节点相交,而不仅仅是那些值相等而已。

这里写图片描述

看我图片画的这么认真,还不关注我博客嘛 ^_^

代码

/**
* 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 || !headB) return NULL;
        ListNode *listA = headA, *listB = headB;
        while (listA && listB) {
            if (listA == listB) return listA;
            listA = listA->next;
            listB = listB->next;

            if (listA == listB) return listA;
            if (listA == NULL) listA = headB;
            if (listB == NULL) listB = headA;
        }
        return listA;
    }
};
updated at 2016/09/20
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode listA = headA, listB = headB;
        while (listA != null && listB != null) {
            if (listA == listB) return listA;
            listA = listA.next;
            listB = listB.next;
            if (listA == listB) return listA;
            if (listA == null) listA = headB;
            if (listB == null) listB = headA;
        }
        return listA;
    }
}
目录
相关文章
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
28 1
|
3月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
36 0
|
6月前
【数据结构OJ题】相交链表
力扣题目——相交链表
40 1
【数据结构OJ题】相交链表
|
5月前
|
存储 Python
【Leetcode刷题Python】1496.判断路径是否相交
Leetcode第1496题"判断路径是否相交"的Python代码实现,通过使用字典存储方向和集合记录访问过的坐标点来检测路径是否与自身相交。
55 2
|
5月前
|
算法 Python
【Leetcode刷题Python】106.相交链表
采用双指针法来找出两个链表的相交起始节点,并详细解释了算法的时间和空间复杂度。
38 1
|
5月前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
6月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
7月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
7月前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)

热门文章

最新文章