Intersection of Two Linked Lists

本文介绍了一种寻找两个单链表交点的算法实现。通过计算两个链表的长度并调整较长链表的起始位置,使两链表剩余部分等长,进而找到交点。适用于无环链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

 

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

 

For example, the following two linked lists:

 

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

begin to intersect at node c1.

题意:

求两个单链表中的元素的交叉部分。此题有一些hints,首先如果两个单链表没有交叉元素存在,那么就直接返回null;没有环存在,然后就是考虑这个交叉到底是什么意思?一开始,我设想的还有点问题,其实这个交叉指的是从某一个节点开始,直到两个单链表的最后一个节点为止,这一部分是不是一致。所以有一种思路是,先求这两个单链表的长度,然后比较,因为只有从某一个节点开始直到单链表的尾部,长度长的那个单链表直接从两个长度差值的那个节点开始搜寻,然后就是用一个循环来依次判断两个节点的val值是否相同,如果相同,那么就可以返回这个节点了。一开始LZ有点纠结的就是这个交叉怎么理解,后来明白了,要从某一个节点开始直到结束,所以用上面的方法解决比较好。以后做这些题思路需要打开一点,java中的各种数据结构的应用还是非常给力的,对于解决这种题目非常有帮助。

 

class ListNode
{
	int val;
	ListNode next;
	ListNode(int x)
	{
		val = x;
		next = null;
	}
}

public class Solution
{
	public static ListNode getIntersectionNode(ListNode headA,ListNode headB)
	{
		if(headA == null || headB == null)
			return null;
		else
		{
			ListNode l1 = headA;
			ListNode l2 = headB;
			int length1 = 1;
			int length2 = 1; 
			while(l1.next != null)
			{
				length1 ++;
				l1 = l1.next;
			}
			while(l2.next != null)
			{
				length2 ++;
				l2 = l2.next;
			}
			//System.out.println(l1.val + "  " + l2.val);
			if(l1.val != l2.val)        //节省计算开销,若发现尾节点不一致,那么就直接返回空,说明两个链表没有交叉出现
				return null;
			else
			{
				//System.out.println(length1 + "  " + length2);
				if(length1 > length2)
				{
					int value = length1 - length2;
					while(value  > 0)
					{
						headA = headA.next;
						value --;
					}
					//System.out.println(headA.val);
				}
				else if(length1 <= length2)
				{
					int value = length2 - length1;
					while(value  > 0)
					{
						headB = headB.next;
						value --;
					}
					//System.out.println(headB.val);
				}
				while(headA.val != headB.val)
				{
					//System.out.println(headA.val + "  " + headB.val);
					headA = headA.next;
					headB = headB.next;
					//System.out.println(headA.val + "  " + headB.val);
				}
				//System.out.println(headA.next.val + "  " + headB.next.val);
				return headB;
			}
		}
	}
    /*
	public static void main(String args[])
	{
		ListNode headA = new ListNode(1);
		ListNode l1 = new ListNode(3);
		ListNode l2 = new ListNode(5);
		ListNode l3 = new ListNode(6);
		ListNode l4 = new ListNode(7);
		ListNode l5 = new ListNode(8);
		ListNode l6 = new ListNode(9);
		ListNode l7 = new ListNode(10);
		headA.next = l1;
		l1.next = l2;
		l2.next = l3;
		l3.next = l4;
		l4.next = l5;
		l5.next = l6;
		l6.next = l7;
		l7.next = null;
		ListNode headB = new ListNode(2);
		ListNode r1 = new ListNode(4);
		ListNode r2 = new ListNode(6);
		ListNode r3 = new ListNode(7);
		ListNode r4 = new ListNode(8);
		ListNode r5 = new ListNode(9);
		ListNode r6 = new ListNode(10);
		headB.next = r1;
		r1.next = r2;
		r2.next = r3;
		r3.next = r4;
		r4.next = r5;
		r5.next = r6;
		r6.next = null;
		System.out.println(getIntersectionNode(headA,headB).val);
	}
    */
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值