leetCode 160. Intersection of Two Linked Lists 链表

简介:

160. Intersection of Two Linked Lists

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.


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.


题目大意:

找出两个链表后半部分的交汇点。

思路:

1.求出两个链表的长度。

2.获取链表长度差n。

3.将长的链表先移动到第n个节点。

4.对长链表和短链表进行比较。(同时向后移动)如果在链表尾之前找到相等的节点,返回该节点,如果没找到,返回NULL。

代码如下:

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
56
57
58
59
60
61
62
63
/**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     ListNode *next;
  *     ListNode(int x) : val(x), next(NULL) {}
  * };
  */
class  Solution {
public :
     int  listLength(ListNode *head) //用快指针求链表长度
     {
         ListNode * p = head;
         int  i = 0 ;
         while (p && p->next)
         {
             i++;
             p = p->next->next;
         }
         if (p == NULL)
             return  2 * i;
         return  2 * i + 1;
     }
     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
         int  lenA = listLength(headA);
         int  lenB = listLength(headB);
         
         int  maxLen = lenA > lenB ? lenA :lenB;
         int  remain ; 
         ListNode * la,*lb;
         la = headA;
         lb = headB;
         
         if (maxLen == lenA)
         {
             remain = lenA - lenB;
             while (remain--)
             {
                 la = la->next;
             }
         }
         else
         {
             remain = lenB - lenA;
             while (remain--)
                 lb = lb->next;
         }
         
         while (lb != NULL)
         {
             if (la != lb)
             {
                 la = la->next;
                 lb = lb->next;
             }
             else
             {
                 return  la;
             }
         }
         return  NULL;
     }
};



本文转自313119992 51CTO博客,原文链接:http://blog.51cto.com/qiaopeng688/1837480

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
300 1
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
347 0
Leetcode第21题(合并两个有序链表)
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
586 10
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
277 0
LeetCode第二十四题(两两交换链表中的节点)
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
349 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
421 0
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
235 0
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
309 0
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
169 0
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
247 0