java+链表+相交_java求两个链表相交的第一个节点

编写一个程序,找到两个单链表相交的起始节点。

41614922f77fa3ef1425747792840187.png

9cd3c97a3f416f009fc87083c0fb9ff8.png

例1的第一个相交节点为C1,例2的第一个相交节点是2.

解法一

两个链表都遍历一遍,分别统计两个链表的长度,做差,然后

用快慢指针,让长的先走差值步,然后快慢指针每次往后遍历

一步,当快指针等于慢指针时,便找到了我们要找的值;1

2

3

4

8343ec4a99cbb05a350dc012249e4c0a.png

代码

/**

* 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; } int lenA = 0;//链表A的长度 int lenB = 0;//链表B的长度 ListNode pl = headA;//永远指向最长的链表 ListNode ps = headB;//永远指向最短的链表 //统计链表A的长度 while(pl != null) { pl = pl.next; lenA++; } //统计链表B的长度 while(ps != null) { ps = ps.next; lenB++; } //遍历完后,ps,pl都指向了链表的末尾,这里 //需要重新指回来 pl = headA; ps = headB; //计算长链表比短链表长的值 int len = lenA - lenB; if(len < 0) { pl = headB; ps = headA; len = lenB-lenA; } //快指针先走差值步 while(len != 0) { pl = pl.next; len--; } //快慢指针一起往后遍历,直到找到相交节点 while(pl != ps) { pl = pl.next; ps = ps.next; } //pl == ps,返回pl,ps都一样 return pl; } }1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

解法二

两链表逐步往后遍历,当链表A遍历完时,将链表B的头赋值给

链表A,并继续遍历,同理,当链表B遍历完时,将链表A的头赋

值给链表B,并继续遍历,直到两相等为止;1

2

3

02b3ebd821acf2838e855c307da1bb3a.png

代码

/**

* 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) { ListNode pA=headA; ListNode pB=headB; while(pA!=pB){ //pA若没遍历完,继续往后遍历,遍历完则遍历pB pA= pA==null ? headB :pA.next; //pB若没遍历完,继续往后遍历,遍历完则遍历pA pB= pB==null ? headA :pB.next; } return pA; }

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

文章来源: blog.youkuaiyun.com,作者:无心浪人,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.youkuaiyun.com/qq_45731021/article/details/112305885

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值