【leetcode】#160. Intersection of Two Linked Lists -相交链表-找出两个链表的交点

题目

leetcode
英文
Given the heads of two singly linked-lists headA and headB, return the node at which the two lists intersect. If the two linked lists have no intersection at all, return null.
It is guaranteed that there are no cycles anywhere in the entire linked structure.
Note that the linked lists must retain their original structure after the function returns.
中文
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构

示例
在这里插入图片描述

函数

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
}

分析

  • 返回的是结构体,还以为是打印输出
  • 这次的想法简直是惨败啊啊啊,用两个指针分别同时遍历两个链表,然后,然后,居然直接判断这两个指针是否相等了。这俩就算相交,相交之前走过的路也不一定一样长呀呀呀。哎,看了题解才明白过来,还以为是自己判断是否相等写错了
  • 看了题解,觉得下面这种说法很好理解
    若相交,链表A: a+c,链表B : b+c, a+c+b+c = b+c+a+c 。则会在公共处c起点相遇。若不相交,a +b = b+a 。因此相遇处是NULL

走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。
浪漫呀

实现

下面是看了题解后写的

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
	struct ListNode *pA, *pB;
	pA = headA;
	pB = headB;
	// 这里不用担心不相交会出现死循环,就算不相交,最后两者都会为 NULL
	while (pA != pB){
		if (pA){
			pA = pA->next;
		}else{
			pA = headB;
		}
		if (pB){
			pB = pB->next;
		}else{
			pB = headA;
		}
	}
	return pA;
}

然后是把两个if else 简化一下的版本

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
	struct ListNode *pA, *pB;
	pA = headA;
	pB = headB;
	// 这里不用担心不相交会出现死循环,就算不相交,最后两者都会为 NULL
	while (pA != pB){
		pA = pA == NULL?headB:pA->next;
		pB = pB == NULL?headA:pB->next;
	}
	return pA;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值